java8之lambda表达式

java8已发布四年之久,但是一直没研究java8的相关新特性,前几天有点闲,就学习了java8的新特性之一lambda表达式,下面就按照我的理解讲讲一些用法。

刚开始使用lambda表达式的时候,感觉不习惯,但是使用了以后发现还是很好用的,简洁,明了,代码少

lambda表达式的语法格式如下:

( parameters ) -> expression ( parameters ) -> { statements ; }

以下是lambda表达式的重要特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。


1.利用lambda表达式对列表进行迭代


控制台:


也可以用:list1.forEach(System.out::println);

这是java8的另一个特性,方法的引用,不过这种没法传递参数,只能用::调用不需要参数的方法

2.使用lambda表达式替代匿名内部类


() -> {}替代了匿名内部类

3.使用lambda表达式和函数式接口Predicate

java8新增了一个包,叫做 java.util.function,接口里面包含了很多类,用来支持函数式编程,其中有一个接口就是Predicate,用Perdicate可以用来过滤,下面我们展示一下过滤集合的相关数据


直接在filter中写过滤条件或者传入一个Predicate都行,有人或许说既然可以直接写过滤条件,用Predicate是不是有点多余了,不不,继续看,你就知道为什么要用Predicate了


4.Predicate之多个过滤条件

若需要多个过滤条件,而不是单单的一个过滤条件,那么怎么实现呢。Predicate提供类似于逻辑操作符AND和OR的方法,名字叫做and()和or(),用于将传入 filter() 方法的条件合并起来。


and()将满足条件的结果查询出来,or()将满足其中任意一个条件的结果查询出来

4.lambda表达式之map

map()统一对元素进行操作


结果:


5.lambda表达式之reduce()

reduce() 函数可以将所有值合并成一个。Map和Reduce操作是函数式编程的核心操作,因为其功能,reduce 又被称为折叠操作。另外,reduce 并不是一个新的操作,你有可能已经在使用它。SQL中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是 reduce 操作,因为它们接收多个值并返回一个值。流API定义的 reduceh() 函数可以接受lambda表达式,并对所有值进行合并。IntStream这样的类有类似 average()、count()、sum() 的内建方法来做 reduce 操作,也有mapToLong()、mapToDouble() 方法来做转换。这并不会限制你,你可以用内建方法,也可以自己定义。


得到的值就是list2集合中的每个元素乘以0.2以后的加和

6.lambda表达式之collect()

将操作之后的结果转换为集合


结果:



将操作之后的结果进行连接


结果:



7.lambda表达式之distinct()去重


结果:

8.计算集合元素的最大值,最小值等

IntStream、LongStream 和 DoubleStream 等流的类中,有个非常有用的方法叫做 summaryStatistics() 。可以返回 IntSummaryStatistics、LongSummaryStatistics 或者 DoubleSummaryStatistic s,描述流中元素的各种摘要数据。在本例中,我们用这个方法来计算列表的最大值和最小值。它也有 getSum() 和 getAverage() 方法来获得列表的所有元素的总和及平均值


结果:



好了,大致总结那么多,其它的有空再总结

注:lambda表达式有个限制,那就是只能引用 final 或 final 局部变量,这就是说不能在lambda内部修改定义在域外的变量。


编译的时候就报错,注意,可以访问但是不能修改