Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘。**lambda表达式允许你通过表达式来代替功能接口。**lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。
基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
应用:
**常规操作:**创建线程,排序等功能
使用Lambdas和Streams:
Stream是对集合的包装,通常和lambda一起使用。 使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等。 同样,Stream使用懒运算,他们并不会真正地读取所有数据,遇到像getFirst() 这样的方法就会结束链式语法。
流操作分为中间操作和终结操作,这两种操作外加数据源就构成了所谓的pipeline,处理管道。
中间操作是懒的,中间操作在pipeline执行到终结操作之前是不会开始执行的。行到终结操作的时候我就要开始遍历数据源并且执行中间操作这个过程了,不会再去等谁了。而且一旦pipeline中的终结操作完成了,那么这个pipeline的使命就完成了,如果你还有新的终结操作,那么对不起,这个旧的pipeline就用不了了,你得新建一个stream。
把Collection切换成管道源很简单,调用stream()就行了。
heros.stream()
但是数组却没有stream()方法,需要使用
Arrays.stream(hs)
或者
Stream.of(hs)
Consumer接口表示一个接受单个输入参数并且没有返回值的操作
Predicate判断输入的对象是否符合某个条件
Consumer<Person> giveRaise = e -> e.setSalary(e.getSalary() / 100 * 5 + e.getSalary());
Predicate<Person> ageFilter = (p) -> (p.getAge() > 25);
好文章:https://www.cnblogs.com/franson-2016/p/5593080.html
pipeline:https://www.cnblogs.com/heimianshusheng/p/5674372.html