摘要:
在 Java 8 中添加了 Stream API,以简化顺序或并行执行批量操作的任务。该 API 提供了两个关键的抽象:流(Stream),表示有限或无限的数据元素序列,以及流管道(stream pipeline),表示对这些元素的多步计算。Stream 中的元素可以来自任何地方。常见的源包括集合, 阅读全文
摘要:
现在 Java 已经有了 lambda 表达式,编写 API 的最佳实践已经发生了很大的变化。例如模板方法模式——其中一个子类重写原始方法以专门化其父类的行为——变得没有那么吸引人。现代替代的选择是提供一个静态工厂或构造方法来接受函数对象以达到相同的效果。通常地说,可以编写更多以函数对象为参数的构造 阅读全文
摘要:
lambda 优于匿名类的主要优点是它更简洁。Java 提供了一种生成函数对象的方法,比 lambda 还要简洁,那就是方法引用( method references)。下面是一段代码片段,它维护一个从任意键到 的 map。如果将该值解释为键的实例个数,则该程序是一个多重集合的实现。该代码的功能是, 阅读全文
摘要:
以往,具有单一抽象方法的接口(或者很少使用的抽象类)被用作函数类型。它们的实例(称为函数对象)表示函数(functions)或行动(actions)。自从 JDK 1.1 于 1997 年发布以来,创建函数对象的主要手段就是匿名类(条款 24)。下面是一段代码片段,按照字符串长度顺序对列表进行排序, 阅读全文
摘要:
虽然 Java 编译器允许在单个源文件中定义多个顶级类,但这样做没有任何好处,并且存在重大风险。风险源于在源文件中定义多个顶级类可能会为一个类提供多个定义。使用哪个定义会依赖于源文件传递给编译器的顺序。 为了具体说明,请考虑下面的源文件,其中只包含一个引用其他两个顶级类( 和 类)的成员的 类: 现 阅读全文
摘要:
嵌套类(nested class)是在另一个类中定义的类。嵌套类应该只存在于其外部类(enclosing class)中。如果一个嵌套类在其他一些情况下是有用的,那么它应该是一个顶级类。有四种嵌套类:静态成员类,非静态成员类,匿名类和局部类。除了第一种以外,剩下的三种都被称为内部类(inner cl 阅读全文
摘要:
有时你可能会碰到一个类,它的实例有两个或更多的风格(flavor),并且包含一个标签属性(tag field),表示实例的风格。例如下面这个类,它可以表示一个圆形或矩形: 这样的标签类有许多缺点。它们有杂乱无章的样板代码,包括枚举声明、标签属性和 switch 语句。可读性差,因为多个实现在一个类中 阅读全文
摘要:
当类实现接口时,该接口会作为一种类型(type),可以被用来引用类的实例。因此,一个类实现了一个接口,就是表明客户端可以对这个类的实例做些什么。为其他目的定义接口是不合适的。 一种失败的接口就是所谓的常量接口(constant interface)。这样的接口不包含任何方法;它只包含静态 final 阅读全文
摘要:
在 Java 8 之前,不可能在不破坏现有实现的情况下为接口添加方法。如果向接口添加了一个新方法,现有的实现通常会缺少该方法,从而导致编译时错误。在 Java 8 中加入了默认方法( default method)构造,目的是允许将方法添加到现有的接口。但是增加新的方法到现有的接口是充满风险的。 默 阅读全文
摘要:
Java 有两种机制定义多实现类型:接口和抽象类。由于在 Java 8 中引入了接口的默认方法,因此这两种机制都允许为某些实例方法提供实现。一个主要的区别是要实现由抽象类定义的类型,该类必须是抽象类的子类。因为 Java 只允许单一继承,所以抽象类的这种局限严格限制了它作为类型定义的使用。任何定义所 阅读全文