Lambda 表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String[] arr = {"Google", "Baidu", "Taobao", "Sina", "Runoob"};
List<String> list = Arrays.asList(arr);

// 使用 java 7 排序
private void sortUsingJava7(List<String> names) {
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
}

// 使用 java 8 排序
private void sortUsingJava8(List<String> names) {
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
}

使用 Java 7 语法:
[Baidu , Google , Runoob , Sina , Taobao ]
使用 Java 8 语法:
[Baidu , Google , Runoob , Sina , Taobao ]

Stream流式操作

问题:
给定一个字符串元素列表,如下所示:

1
["1", "2", "bilibili", "of", "codesheep", "5", "at", "BILIBILI", "codesheep", "23", "CHEERS", "6"]

找出所有长度 >=5 的字符串,并且忽略大小写、去除重复字符串,然后按字母排序,最后用“-”连接成一个字符串输出!

来,小伙伴们,5分钟,搞定它。。。什么搞定不了,该去补习补习了。
那么使用Java8怎么搞定呢,开启装逼模式:

1
2
3
4
5
6
7
8
9
10
String result = list.stream()                        // 首先将列表转化为Stream流        
.filter( i -> !isNum(i) ) // 筛选出字母型字符串
.filter( i -> i.length() >= 5 ) // 其次筛选出长度>=5的字符串
.map( i -> i.toLowerCase() ) // 字符串统一转小写
.distinct() // 去重操作来一下
.sorted( Comparator.naturalOrder() ) // 字符串排序来一下
.collect( Collectors.joining("-") ); // 连词成句来一下,完美!
System.out.println(result);

输出:bilibili-cheers-codesheep

这操作够sao了吧!

Consumer接口

Consumer的语义是消费的意思,了解一些消息队列的同学,肯定对这个单词,有一定的理解。
看个简单的例子:打印3次 Hello World!

1
2
3
4
5
6
7
8
9
// 原来的写法
System.out.println("Hello World!");
System.out.println("Hello World!");
System.out.println("Hello World!");

//使用Consumer接口
Consumer c = System.out::println;

c.andThen(c).andThen(c).accept("Hello World!");

搞定。

一个简单的平方计算:

1
2
Consumer<Integer> square = x -> System.out.println("print square : " + x * x);
square.accept(2);

Optional接口

Optional本质是个容器,你可以将你的变量交由它进行封装,这样我们就不用显式对原变量进行 null值检测,防止出现各种空指针异常。举例:

1
2
3
4
5
6
7
8
9
public Integer getScore( Student student ){
if(student != null){
Subject sub = student.getSubject();
if(sub != null){
return sub.getScore();
}
}
return null;
}

多嵌套的 if 判空,这么处理当然可以,然而有更好的解决办法哦。

1
2
3
4
5
6
public Integer getScore(Student student){
return Optional.ofNullable(student)
.map(Student::getSubject)
.map(Subject::getScore)
.orElse(null);
}

完美实现。

ddAnswer

更多文章请关注微信公众号: zhiheng博客

如果文章对你有用,转发分享、点赞赞赏才是真爱 [斜眼笑]