λ表达式有三部分组成:形参列表,箭头(->),以及一个表达式或语句块。
在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Java8为集合类引入了另一个重要概念:stream,流的API设计使用了管道(pipelines)模式。对流的一次操作会返回另一个流。
新的东西
1、参考https://github.com/changhf/stream1,熟练使用Predicate,Consumer,Optional,Function,Supplier几个接口
2、java.util.Time包下API包括LocalDate,LocalTime,LocalDateTime,ZoneId,DateTimeFormatter,Period
用法介绍
一、λ表达式与方法引用的对比
1、静态方法引用:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
2、对象的方法引用:
converter = something::startsWith;
String converted = converter.convert("Java");
3、构造函数的引用,Java编译器会自动根据PersonFactory.create方法的签名来选择合适的构造函数。
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
Stream.generate(new Supplier<Double>() {
@Override
public Double get() {
return Math.random();
}
});
Stream.generate(() -> Math.random());
Stream.generate(Math::random);
方法引用使用场景:静态方法引用、实例方法引用、构造器引用 (Integer::parseInt System.out::print Person::new)
二、转换与汇聚
1、在对于一个 Stream 进行多次转换操作,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。
2、汇聚操作把序列中的元素合并成一个汇总的结果
Java8还提供了工具类Collectors
Collectors.toList()收集到List中;Collectors.toSet()收集到Set中
List<Integer> numsWithoutNull = nums.stream().filter(num -> num != null).collect(Collectors.toList());
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。
二、Optional的用法:
怎样创建一个Optional对象,基本的规则很简单:
//如果我们知道自己要封装的对象是一个空对象
Optional.absent();
//如果封装的对象是一个非空对象,则可以用
Optional.of(obj);
//如果不知道对象是否为空,就这样创建
Optional.fromNullable(obj);
有时候,当一个对象为null的时候,我们并不是简单的忽略,而是给出一个缺省值,比如找不到这个人,任务就交给经理来做。
Optional person = people.find("John Smith");
person.or(manager).doSomething()
说白了,Optinal是给了我们一个更有意义的“空”。
参考:java中匿名内部类总结