- 流的使用
- stream
- 用法
- 流操作常见用法
- 遇到的问题
- stream一般用于集合中, 可以更简单的对集合进行查找, 遍历, 过滤
如果要将list转为map, 用普通代码来写
// 假设有这么个集合: Liststudents // 要将转为 map // 第一种方法 Map map = new HashMap<>(); for (int i = 0; i < students.size(); i++) { Student student = students.get(i); map.put(student.getId(), student); } // 第二种方法 Map map = new HashMap<>(); students.forEach(student -> map.put(student.getId(), student)); // 第三种方法 Map map = students.stream().collect(Collectors.toMap(Student::getId, student -> student));
- 获取list
中的所有id
// 第一种方式 List用法list = new ArrayList<>(); students.forEach(student -> list.add(student.getId())); // 第二种方式 List ids = students.stream().map(Student::getId).collect(Collectors.toList());
- students 为对象集合
- students.stream() 将之转换为 流对象, 流对象就可以进行特有操作
- students.stream().map(函数) map可以对对象集进行处理, 如上文的获取student的id,将这些ids,生成一个新的流并返回
- map也可替换为filter(条件): students.stream().filter(student -> student.getScore().equals("B")).forEach(System.out::println); 将所有满足条件的打印出来
- students.stream().map(函数).collect(Collectors.toList()), collect可以将结果转为集合对象(toList/toMap…)
- 你也可以不用生成一个对象, 而是直接打印, students.stream().map(函数).forEach(System.out::println)
1. 将List转为Map(将id, name 转为map)
MapidAndName = list.stream().collect(Collectors.toMap(Student::getId, Student::getName));
2. 将list转为Map2(将id, 此对象 转为map)
MapstuMap = list.stream().collect(Collectors.toMap(Student::getId, stu -> stu));
3. 将list转为Map(若map的key重复, 保留第一个value)
// 如果有相同一个id, 有两个值对应, 分别为v1(老数据), v2(新数据) 最后保留v1: (v1, v2) -> v1 MapstuMap = list.stream().collect(Collectors.toMap(Student::getId, stu -> stu, (v1, v2) -> v1));
4. 将list转为map(按某一条件分组, 这里是按性别分组)
Map> genderMap = list.stream().collect(Collectors.groupingBy(Student::getGender));
5. 过滤: 将满足条件的对象留下
// filter中的条件可以有多个, 使用 & 连接 ListgenderList = list.stream().filter(student -> student.getGender().equals("男")).collect(Collectors.toList()); List genderList = list.stream().filter(student -> student.getGender().equals("男") && student.getId().equals("no001")).collect(Collectors.toList());
6. list的排序, 这个不算stream操作,
// 这里排序后, 会返回自身, 所以不需要再次定义一个对象来接受 list.sort(Comparator.comparing(Student::getId));
7. list计算某一属性值的和
long sum = zhjlSingleProjects.stream().mapToLong(ZhjlSingleProject::getControlContractPrice).sum();遇到的问题
- 生成map的时候, 出现key是重复的, 此时抛出异常java.lang.IllegalStateException: Duplicate key Student{id='1', name='张1', grade='初一', score='B'}
解决方案: 后面添加(v1, v2) -> v1, 说明若有重复, 保留前面; 若要保留后面, 换成(v1, v2) -> v2即可
Mapmap1 = students.stream().collect(Collectors.toMap(Student::getId, student -> student, (v1, v2) -> v2));



