Java8 Stream操作集合
1、List转化为新的List
//取出某个属性转化为新的集合
List<String> userNameList = list.stream().map(User::getUsername).collect(Collectors.toList());
//转化为其他对象的集合
List<UserVO> userVOList = list.stream().map(item -> new UserVO(item)).collect(Collectors.toList());
//map()中还可以写复杂逻辑
list.stream().map(item -> {
item.setUsername("xxx");
item.setEmail("xxx");
//......
return item;
}).collect(Collectors.toList());
2、List转Map
- 键值对都是某一个属性
//注意:使用User::getId这种方式取值时,如果集合中的元素,这两个属性有为null的时候,会抛出空指针异常
Map<String, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getUsername));
Map<String, String> map =
list.stream().collect(Collectors.toMap(item -> item.getId(), item -> item.getUsername()));
- key为属性,value为对象本身
Map<String, User> map = list.stream().collect(Collectors.toMap(User::getId, item -> item));
3、过滤数据
//简单的过滤规则
List<User> newList = list.stream().filter(item -> StrUtil.isNotBlank(item.getNickname())).collect(Collectors.toList());
//自定义复杂规则
List<User> newList = list.stream().filter(item ->{
if (StrUtil.isNotBlank(item.getUsername()) && "xxx".equals(item.getNickname())) {
return true;
}
//。。。。。。
return false;
}).collect(Collectors.toList());
4、List统计(求和、最大值、最小值、平均值)
- 求和
//这里是先过滤为空的数据再求和
Integer num = list.stream().filter(item -> item.getSort() != null).mapToInt(User::getSort).sum();
- 最大值
list.stream().mapToDouble(User::getHeight).max()
- 最小值
list.stream().mapToDouble(User::getHeight).min()
- 平均值
list.stream().mapToDouble(User::getHeight).average()
5、将List转换为用逗号隔开的字符串
String result = list.stream().map(String::valueOf).collect(Collectors.joining(","));
6、判断两个集合是否相等
//思路:将需要比较的属性值取出来转化为字符串,让后使用字符串的 equals()方法去比较(或者使用自定义的比较规则去比较,自己扩展)
boolean equals = list.stream().map(item -> Integer.toString(item.getSort()))
.sorted().collect(Collectors.joining())
.equals(
list1.stream().map(item -> Integer.toString(item.getSort()))
.sorted().collect(Collectors.joining())
);
7、Map格式转换
//模拟数据,id为key,昵称为value
Map<String, String> map = new HashMap<>();
map.put("1", "张三");
map.put("2", "李四");
//转化为,id为key,User对象为value(这里默认User有通过昵称创建的构造方法)
Map<String, User> newMap = map.entrySet().stream().collect(Collectors.toMap(item -> item.getKey(), item -> new User(item.getValue())));
/**
* list 转 map
* 使用Collectors.toMap的时候,如果有可以重复会报错,所以需要加(k1, k2) -> k1
* (k1, k2) -> k1 表示,如果有重复的key,则保留第一个,舍弃第二个
*/
Map<Long, UserInfo> userInfoMap = userInfoList.stream().collect(Collectors.toMap(UserInfo::getUserId, userInfo -> userInfo, (k1, k2) -> k1));
userInfoMap.values().forEach(a->System.out.println(a.getUserName()));
8、根据字段去重
list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new));
9、取交集、并集、差集、去重并集
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
list1.add("3");
list1.add("4");
list1.add("5");
List<String> list2 = new ArrayList<>();
list2.add("2");
list2.add("3");
list2.add("6");
list2.add("7");
// 交集
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());
System.out.println("---交集 intersection---");
intersection.parallelStream().forEach(System.out::println);
// 差集 (list1 - list2)
List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
System.out.println("---差集 reduce1 (list1 - list2)---");
reduce1.parallelStream().forEach(System.out::println);
// 差集 (list2 - list1)
List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());
System.out.println("---差集 reduce2 (list2 - list1)---");
reduce2.parallelStream().forEach(System.out::println);
// 并集
List<String> listAll = list1.parallelStream().collect(toList());
List<String> listAll2 = list2.parallelStream().collect(toList());
listAll.addAll(listAll2);
System.out.println("---并集 listAll---");
listAll.parallelStream().forEachOrdered(System.out::println);
// 去重并集
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
System.out.println("---得到去重并集 listAllDistinct---");
listAllDistinct.parallelStream().forEachOrdered(System.out::println);
}
10、根据某属性分组
//根据部门分组
Map<Long, List<PerformanceTargetItemEntity>> map =
list.stream().collect(Collectors.groupingBy(PerformanceTargetItemEntity::getDeptId));
11、分组后取每组最大值
//分组 然后取每组version最大值(取最大值之后排除已删除的)的那条数据
List<String> permissionList = list.stream()
.collect(
Collectors.groupingBy(FirstConfirmTemplateItem::getTag,
Collectors.maxBy(Comparator.comparingInt(FirstConfirmTemplateItem::getVersion)))
).values().stream().map(Optional::get)
.filter(item -> !StringUtils.equals(item.getChangeType(), FirstConfirmTemplateChangeTypeEnum.DELETE.getCode()))
.map(FirstConfirmTemplateItem::getPermissions).collect(Collectors.toList());
12、字段排序
正序
List.stream().sorted(Comparator.comparing(PersEmpHouseholdExcelDto::getId)).collect(Collectors.toList());
倒序
List.stream().sorted(Comparator.comparing(PersEmpHouseholdExcelDto::getId).reversed()).collect(Collectors.toList());
13、找出重复的元素
List<String> list = new ArrayList<>();
//......
List<String> duplicateElements = list.stream() // list 对应的 Stream
.collect(Collectors.toMap(e -> e, e -> 1, (a, b) -> a + b)) // 获得元素出现频率的 Map,键为元素,值为元素出现的次数
.entrySet().stream() // 所有 entry 对应的 Stream
.filter(entry -> entry.getValue() > 1) // 过滤出元素出现次数大于 1 的 entry
.map(entry -> entry.getKey()) // 获得 entry 的键(重复元素)对应的 Stream
.collect(Collectors.toList());
System.out.println("list 中重复的元素:" + duplicateElements);
14、遍历List、Map
/**
* forEach 遍历集合List列表
*/
List<String> userNameList = Arrays.asList("aaa", "bbb", "ccc");
userNameList.forEach(System.out::println);
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("a", "123");
hashMap.put("b", "345");
hashMap.put("c", "456");
/**
* forEach 遍历集合Map
*/
hashMap.forEach((k, v) -> System.out.println(k + ":\t" + v));
15、findFirst 返回第一个
List<String> list = Arrays.asList("A", "B", "F", "A", "C");
list.stream().findFirst().ifPresent(System.out::println);
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 奇怪的阿峰
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果