Java lambda表达式(一)——语法
一.为什么要用lambda 表达式
1. 为什么要用lambda表达式?
长期以来,Java语言被吐槽”臃肿不堪“,不如Ruby、python、groovy等”动态“原因简介明了。所谓简明了,大家一般指的是下面这些:
代码行数多。比如 for each、 java bean的getter、setter,所以Java程序员的代码量一般很高。
api不够自然表意,不如动态语言的”语法糖“丰富。
Java平台是不断进化的,针对这些”槽点“,jdk开发者从Java 8
开始,提供了越来越丰富的语法糖,各种lambda 表达式
让代码越来越简明 。甚至在Java 11
的里程碑计划中, var
关键字已经本采用了,所以Java”越来越Scala化“了。作为开发者,要了解这些特性,并熟练掌握,为我所用。
2. 什么是Java lambda表达式?
- Lambda 表达式是一个匿名方法,将行为像数据一样进行传递
- Lambda 表达式的基本结构:
BinaryOp<Integer> add = (x+y) -> x+y
- 函数接口指具有单个抽象方法的接口,用来表示 Lambda表达式的类型
二.lambda 表达式的使用方式
1、流(stream)
Stream
即为java.util.stream.Stream
我们有这一样一个例子:计算一个小组中男人的数量。
外部迭代
我们一般会用for循环来计算
1 | int count = 0; |
for循环其实是封装了迭代的语法糖Iterator对象
1 | int count = 0; |
内部迭代
1 | int count allMembers.stream().filter().count(member -> member.isMale()); |
2、常用流操作
collect(toList())
map
flatMap
max和min
rduce
3、集合和收集器
Collectors
即为java.util.stream.Collectors
转换成其他集合
1 | /** 转换成TreeSet **/ |
转换成值
1 | /** 转换成TreeSet **/ |
数据分组
1 | /** 使用主唱对专辑分组 **/ |
组合收集器
1 | /** 使用收集器求每个艺术家的专辑名 **/ |
4、利用lambda表达式编写并发程序
非阻塞IO,异步IO,可以并发处理大量网络连接。Lambda可以方便api处理
5、问题:一个数据操作 TreeSet set = allMembers.stream().collect()的allMembers在最后被修改了么?哪一步在转换成流、流操作、收集几步中?哪一步真正对数进行了处理?
没有修改,在收集阶段对结果进行了修改
聊天室(回调) TODO
利用java8的CompletableFuture异步并行操作(Future)
示例代码见:《Java lambda表达式(二)—利用java8的CompletableFuture异步并行操作》
参考:《Java 8函数式编程》https://book.douban.com/subject/26346017/
感谢您的阅读,本文由 王欣的博客 版权所有。如若转载,请注明出处:王欣的博客(https://wangxin.io/2018/07/08/java/java_lambda_syntax/)