1.lambda表达式:
老版本的Java排列字符串:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
在Java 8 中就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
还可以写得更短:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
对于函数体只有一行代码的,可以去掉大括号{}以及return关键字:
Collections.sort(names, (a, b) -> b.compareTo(a));
2.函数式编程:
“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求, 只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
3.Stream api:
Java8 以前处理集合时,通常会迭代所有元素并对其中的每一个进行处理。
现在可以进行迭代了:
- 一个Stream表面上看与一个集合很类似,允许你改变和获取数据,但实际上它与集合有很大区别
- filter:产生一个新的流,其中包含符合某个特定条件的所有元素
- map:对一个流中的值进行某种形式的转换
- flatMap: monads 理论实现,将多个函数结果展开
- Stream.limit(n) : 返回一个包含n个元素的新流。这个方法适用于裁剪指定长度的流
- Stream.skip(n) :丢弃掉前面n个元素。
- Stream.concat(a, b) : 将两个流连接到一起
- distinct: 根据原始流中的元素返回一个具有相同顺序,抑制了重复元素的新流。
- sort:对流进行排序,Java8提供了多个sorted方法。其中一个用于其中元素实现了Comparable接口的流,另一个接受一个Comparator对象。
- Collections.sort方法会对原有的集合进行排序,而 Stream.sorted方法会返回一个新的已排序的流。
- Optional对象 或者是对一个T类型对象的封装,或者表示不是任何对象。它比一般指向T类型的引用更安全,因为它不会返回 null。
- 如果希望对元素求和,或者以其他方式将流中的元素组合为一个值,可以使用reduce方法。
4.新的日期时间API:
- 新版的日期和时间API中,日期-时间对象是不可变的。 新的API提供了两种不同的时间表示方式,有效地区分了运行时人和机器的不同需求。
- 可以用绝对或者相对的方式操纵日期和时间,操作的结果总是返回一个新的实例,老的日期-时间对象不会发生变化。
5.其他改进: - 字符串:String 增加了 join 方法.
- 数字类:Short,Integer,Long,Float,Double提供了sum,max,min用来在流操作中作为聚合函数使用。
Integer 类支持了无符号数据计算, 例如 以前的 Byte表示 -128 到127 的范围,现在可以调用静态方法
Byte.toUnsignedInt(b)来获取一个从 0 到 255 的值。 - 新的数学函数:addExact,multiplyExact , floorMod。
- 集合:增加 removeIf : 会删除所有匹配的值。 增加了replaceAll 方法。
Iterator接口增加了forEachRemaining:能够将剩余的迭代元素都传递给一个函数。Comparator
接口增加了许多有用的方法,comparing:接受一个“键提取器”函数,将某类型T映射为一个可比较的类型(例如String)。