一 、前言:
是的没有听错,jdk13就要来了,相信大多数的人还是在使用这jdk8,我也是一样。再次之前也有看过lambda的方面的内容,但是总是觉得这些花架子,这些语法糖让代码变得更加难读了,知道最近换了新的公司,看到代码中大量的lambda的部分才觉得,lambda 的表达能力很强而且能够大大的简化代码的行数,大家都知道最近些年大量的语言大火,其实都是觉得java 代码太过臃肿,的确java代码动辄上百行看着的确的难受,lambda便是在这种情况下诞生的,下面将会结合一些实际的具体的应用的例子来讲述lambda的用法,可能不会很全面剩余的后面有发现在补充出来吧。
二、具体的应用场景例子:
2.1、前置的数据
我们提前准备好数据,后面的例子都会围绕着这些数据来展开:
@Data
@AllArgsConstructor
class Person {
private Integer id;
private String name;
private Integer age;
private String birth;
}
List<CollectionLambdaLesson2.Person> personList;
@Before
public void init() {
CollectionLambdaLesson2.Person p1 = new CollectionLambdaLesson2.Person(1,"t1", 10, "2019-01-02");
CollectionLambdaLesson2.Person p2 = new CollectionLambdaLesson2.Person(2,"t2", 13, "2019-01-02");
CollectionLambdaLesson2.Person p3 = new CollectionLambdaLesson2.Person(3,"t3", 12, "2019-01-03");
CollectionLambdaLesson2.Person p4 = new CollectionLambdaLesson2.Person(4,"t4", 14, "2019-01-04");
personList = new ArrayList<>();
personList.add(p1);
personList.add(p2);
personList.add(p3);
personList.add(p4);
}
2.2、集合排序:
- 常规做法:
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
// 在这个地方写具体的算法比较
return 0;
}
});
- 使用lambda 的做法:
// 顺序
personList.stream().sorted(Comparator.comparing(Person::getAge)).forEach(System.out::println);
// 按照年龄逆序 personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).forEach(System.out::println);
- 扩展一下,如果需要我们自定义排序规则则可以这样来写
personList.stream().sorted(Comparator.comparing(Person::getAge,(x,y)->{
if (Objects.equals(x,y)){
return 0;
}
return 1;
})).collect(Collectors.toList()).forEach(System.out::println);
2.3、获取数据的ids的集合:
- 传统的写法
这个写法我就不再写了,大体的就是我们写个for循环然后取出id放到一个列表中返回,下面我们看看lambda的实现 - lambda的实现:
public void getIdsList() {
List<String> collect = personList.stream().map(Person::getId).collect(Collectors.toList());
System.out.println(collect);
}
一般的情况下我们借助mybatis的example来操作上面而我们获取的ids的列表即可获取数据,但是下面我们想更进一步返回1,2,3 这样的ids 的列表又该如何来做呢:这就需要使用到lambda的规约
public void getIdsList2(){
Optional<String> reduce = personList.stream().map(e -> e.getId()).reduce((x, y) -> x + "," + y);
System.out.println(reduce.get());
}
2.3、java集合中的groupingBy有没有听说过呢:
下面我们要实现下面的一个需求:
看到上面的图是不是又在想sql语句该怎么去写了呢,不用sql语句,下面我们使用lambda来搞定:
- lambda 分则功能:
// 1、我们通过出生日期进行分则,然后放置到一个map中
Map<String, List<Person>> collect = personList.stream().collect(Collectors.groupingBy(Person::getBirth));
TreeMap<String, List<Person>> treeMap = new TreeMap<>(
personList.stream().collect(Collectors.groupingBy(Person::getBirth))
);
treeMap.keySet().forEach(key -> {
System.out.println(key);
System.out.println(treeMap.get(key));
});
我们可以看到 在 2019-01-02有两个人的生日在这一天,剩余就是而我们通过上面的循环进行计算了。
2.4、过滤功能:
lambda 的过滤功能是十分的强大的,但是目前我掌握的不多就简单的写一个例子,后面会在好好的整理的:
personList.stream().map(p->{
if (p.getName().contains("三")){
p.setAddr("湖北");
}else{
p.setAddr("河南");
}
return p;
}).collect(Collectors.toList()).forEach(System.out::println);
}
2.5、获取集合元素的最小|大值:
public void testStreamMix(){
Optional<Person> min = personList.stream().min(Comparator.comparing(Person::getAge));
System.out.println(min);
}
三、总结:
lambda 这玩意儿目前了解不是很深,目前也只是阅读别人的源码中了解到了这个玩意儿还可以这么用的阶段,后面会好好的整理这部分的内容,结合api来看,目前的使用来说给人的体验还是比较好的,后面又发现还会继续的分享出来的。
博客首发地址csdn:https://blog.csdn.net/weixin_42849915
简书地址:https://www.jianshu.com/u/4b48be4cf59f
希望结识更多的乐于分享的伙伴一起前行