话不多说,现在开始。
点击目录,跳转浏览。
类别目录
1. 使用实例
1.1 - 简单使用
- 初始化数据
() -> 5
从上面我们可以总结出,当lambda 表达式的写法,写成下方样式的时候
() -> 5
相当于传入一个方法,方法默认返回值为5,具体的写法也可以写成
() -> { return 5; }
等价于
public int method(){ return 5; }
1.2 - 使用:: 操作符
java8 中新增的一种关键字,我们可以通过 ::
关键字来访问类的构造方法,对象方法,静态方法等。
在使用lambda 的过程中,比如以下情况
(str) -> System.out.println(str);
可以精简为
System.out::println
此时代码可以自动将前面流操作所返回的数据,进行对该方法参数的填充,从而让代码更好的理解,可以更多的关注于业务层面。
相同的使用方法还有:
String::new // 可以创建出一个String 对象
(如有更多例子可以下面留言,我来添加到文章中)
1.3 - 使用@FunctionalInterface 注解
(暂未开坑)
2. 使用Stream
初始化数据
List<Long> sourceList = new LinkedList<>();
sourceList.add(1L);
sourceList.add(2L);
sourceList.add(3L);
sourceList.add(4L);
sourceList.add(5L);
Map<String, Integer> sourceMap = = new LinkedHashMap<>();
sourceMap.put("a1", 1);
sourceMap.put("a2", 2);
sourceMap.put("a3", 3);
sourceMap.put("a4", 4);
sourceMap.put("a5", 5);
2.1 - sorted
可以使用sorted
方法进行排序,参数上可以传入一个Comparator
对象来进行处理排序规则,具体的排序顺序,可以看具体教程。(默认为字典排序,既从小到大排序)
简单来讲Comparator 方法的实现,在于
o1
与o2
的比较结果。
如果o1
比o2
小,则返回小于0
的返回值。
如果o1
大于o2
,则返回大于0
的返回值。
如果相同,则返回0
;
List<Long> result = sourceList.stream().sorted(new Comparator<Long>() {
@Override
public int compare(Long o1, Long o2) {
return o1.compareTo(o2);
}
});
此方法也可以精简为
List<Long> result = sourceList.stream().sorted((o1, o2) -> o1.compareTo(o2));
还可以进一步精简为
List<Long> result = sourceList.stream().sorted(Long::compareTo);
2.2 - filter
List<Long> result = sourceList
.stream()
.filter(e -> e > 3)
.collect(Collectors.toList());
该方法可以筛选出值大于3 的所有数值,并返回一个集合。
2.3 - 数组如何使用stream 操作
Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> result = Arrays.stream(arr).collect(Collectors.toList());
List<Integer> result = Stream.of(arr).collect(Collectors.toList());
操作数组可以使用Arrays.strea()
的方式,或者使用Stream 通用的生成方式Stream.of()
2.4 - map
List<String> result = sourceList
.stream()
.map(String::valueOf)
.collect(Collectors.toList());
类型转换的操作,可以借用map
方法,可以理解为,将整个数组一个一个的遍历,每次有一个数据到达map
方法的时候,就会执行map
方法中的处理,并将一个返回值提交给下一个方法去执行。
样例中的方法用处,是将原数组中的Long
类型数值,转换为String
类型,并将返回的String
类型数据进行组装集合。
2.5 - collect 收集操作
从2.4 的例子中,我们不难看出,collect 方法的主要用处就是组装数据,并将数据整理成目标样子。
list
、set
等太简单,举出样例跳过
组装List 数组
collect(Collectors.toList())
组装Set 数组
collect(Collectors.toSet())
组装map 集合
从现在开始,就是collect
方法常用的几种方式了
首先初始化数据
// 创建一个Student 的实体类
@Data // 我这里使用的lombok 简化
public class Student {
private Integer num; // 学号
private String name; // 姓名
private Integer roomId; // 教室编号
}
// 初始化数据列表
List<Student> sourceList = new LinkedList<>();
sourceList.add(new Student(1, "张三", 1001));
sourceList.add(new Student(2, "李四", 1001));
sourceList.add(new Student(3, "王五", 1003));
sourceList.add(new Student(4, "赵六", 1003));
将该list
转换为map
集合数据。
Map<Integer,Student> map = sourceList
.stream()
.collect(Collectors.toMap(Student::getNum, e -> e));
组装的map 集合中,key 就是每个学生的id,value 就是每个学生的实体类。
拼接字符串
该拼接字符串的方式,极大的方便了数据拼接,省时省力。
常见于如微信支付中数据签名时拼接&
字符等
String names =sourceList
.stream()
.map(Student::getName)
.collect(Collectors.joining(","));
这是字符串names
的值,为张三,李四,王五,赵六
数据分组
常用于整合list
集合中的重复数据进行数据分组。
Map<Integer, List<Student>> rooms = sourceList
.stream()
.collect(Collectors.groupingBy(Student::getRoomId));
当前集合中,key 为教室id,value 为该教室的学生集合。
(如有需要,可以留言提交,我会补充,工作比较忙,敬请见谅)