栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java流操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java流操作

这里写自定义目录标题
  • 流的使用
    • stream
    • 用法
    • 流操作常见用法
    • 遇到的问题

流的使用 stream
  1. stream一般用于集合中, 可以更简单的对集合进行查找, 遍历, 过滤

如果要将list转为map, 用普通代码来写

// 假设有这么个集合:  List students
// 要将转为 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));
  1. 获取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)

Map idAndName = list.stream().collect(Collectors.toMap(Student::getId, Student::getName));

2. 将list转为Map2(将id, 此对象 转为map)

Map stuMap = list.stream().collect(Collectors.toMap(Student::getId, stu -> stu));

3. 将list转为Map(若map的key重复, 保留第一个value)

// 如果有相同一个id, 有两个值对应, 分别为v1(老数据), v2(新数据)  最后保留v1: (v1, v2) -> v1
Map stuMap = 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中的条件可以有多个, 使用 & 连接
List genderList = 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();
遇到的问题
  1. 生成map的时候, 出现key是重复的, 此时抛出异常java.lang.IllegalStateException: Duplicate key Student{id='1', name='张1', grade='初一', score='B'}

解决方案: 后面添加(v1, v2) -> v1, 说明若有重复, 保留前面; 若要保留后面, 换成(v1, v2) -> v2即可

Map map1 = students.stream().collect(Collectors.toMap(Student::getId, student -> student, (v1, v2) -> v2));
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号