泛型接口改进这是一个以前不能做到的,对编译器判定泛型能力的努力改进。在以前版本的Java中有许多情形编译器不能给某个方法计算出泛型,当方法处于嵌套的或串联方 法调用这样的上下文的时候,即使有时候对程序员来说它看起来“很明显”。那些情况需要程序员明确的指定一个“类型见证”(type witness)。它是一种通用的特性,但吃惊的是很少有Java程序员知道(我这么说是基于私下的交流并且阅读了一些StackOverflow的问 题)。它看起来像这样:
如果没有类型见证,编译器可能会将<Object>替代为泛型,而且如果需要的是一个更具体的类型,代码将编译失败。 Java 8 极大的改进了这个状况。在更多的案例中,它可以基于上下文计算出更多的特定的泛型类型。
这项工作仍在发展中,所以我不确定建议中列出的例子有多少能真正包含进Java 8。希望是它们全部。 java.time包概要: java.time 在Java8中新的 date/timeAPI存在于 java.time包中。如果你熟悉Joda Time,它将很容易掌握。事实上,我认为如此好的设计,以至于从未听说过 Joda Time的人也能很容易的掌握。 几乎在API中的任何东西都是永恒的,包括值类型和格式化 。对于Date域或者处理或处理本地线程日期格式化不必太过担心。 与传统的date/timeAPI的交叉是最小的。有一个清晰的分段: 那么,那是什么呢?包级别的javadocs 对额外类型的做出了非常好的阐述。我将对一些值得注意的部分做一些简短的纲要。 非常有用的值类型:
其他有用的类型:
大多数情况下,新的值类型由JDBC提供支持。有一小部分异常,如ZonedDateTime在SQL中没有对应的(类型)。 集合API附件实际上接口能够定义默认方法允许了JDK作者加入大量的附件到集合API接口中。默认实现在核心接口里提供,而其他更有效或更好的重载实现被加入到可适用的具体类中。 这里是新方法的列表:
同样, Iterator.remove() 现在有一个默认的, 会抛出异常的实现,使得它稍微容易地去定义不可修改的迭代器。 Collection.stream()和Collection.parallelStream()是流API的主要门户。有其他方法去生成流,但这些在以后会更为长用。 List.sort(Comparator)的附件有点怪异。以前排序一个ArrayList的方法是:
这代码是你在Java7里唯一可选的,非常低效。它会复制list到一个数组里,排序这个数组,然后使用ListIterator来把数组插入到新list的新位置上。 List.sort(比较器)的默认实现仍然会做这个,但是具体的实现类可以自由的优化。例如,ArrayList.sort在ArrayList内部数组上调用了Arrays.sort。CopyOnWriteArrayList做了同样的事情。 从这些新方法中获得的不仅仅是性能。它们也具有更多的令人满意的语义。例如, 对Collections.synchronizedList()排序是一个使用了list.sort的原子操作。你可以使用list.forEach对 它的所有元素进行迭代,使之成为原子操作。 Map.computeIfAbsent使得操作类似多重映射的结构变得容易了:
增加并发API
有太多的链接可以点击,因此参看ConcurrentHashMap javadocs文档以获得更多信息。
ConcurrentHashMap.newKeySet()提供了一个并发的java.util.Set实现。它基本上是 Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>())的另一种方式的重写。 StampedLock是一种新型锁的实现,很可能在大多数场景都可以替代ReentrantReadWriteLock。 当作为一个简单的读写锁的时候,它比RRWL的性能要好。它也为“读优化”提供了API,通过它你获得了一个功能有点弱,但代价很小的读操作锁的版本,执 行读操作,然后检查锁是否被一个写操作设定为无效。在Heinz Kabutz汇总的一系列幻灯片中,有更多关于这个类及其性能的细节(在这个系列幻灯片大约一半的地方开始的):"移相器和StampedLock演示" CompletableFuture<T>是Future接口的一个非常棒的实现,它提供了无数执行(和串接)异步任务的方法。它特别依赖功能性的接口;lambdas是值得增加这个类的一个重要原因。如果你正在使用Guava的 Future工具,例如Futures, ListenableFuture, 和 SettableFuture,那么你可能会希望校验CompletableFuture能否作为潜在的替代选择。 IO/NIO API的新增内容
|