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
2
3
4
5
6
int count = 0;
for(Member meber : allMembers){
if(member.isMale()){
count++;
}
}

for循环其实是封装了迭代的语法糖Iterator对象

1
2
3
4
5
6
7
8
int count = 0;
Iterator<Member> iterator = allMembers.iterator();
while(iterator.hasNext()){
Member meber =iterator.next();
if(member.isMale()){
count++;
}
}

内部迭代

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
2
3
/** 转换成TreeSet **/
List<Member> allMembers = new ArrayList<>();
TreeSet set = allMembers.stream().collect(ToCollection(TreeSet::new));

转换成值

1
2
3
/** 转换成TreeSet **/
List<Member> allMembers = new ArrayList<>();
TreeSet set = allMembers.stream().collect(ToCollection(TreeSet::new));

数据分组

1
2
3
4
5
/** 使用主唱对专辑分组 **/
/** 类似于sql的group by **/
private Map<Artist,List<Album>> albumByArtist(Stream<Album> albums){
return albums.collect(groupingBy(album -> album.getMainMusician()));
}

组合收集器

1
2
3
4
/** 使用收集器求每个艺术家的专辑名 **/
private Map<Artist,List<Album>> nameOfAllAlbums(Stream<Album> albums){
return albums.collect(groupingBy(album -> album.getMainMusician(),mapping(Album::getName,toList())));
}

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/
Apache 提交者注册流程
Java lambda表达式(二)——利用java8的CompletableFuture异步并行操作