概述
Stream流式处理
- filter的使用
- removeIf的使用
- 去重
- 给集合内对象属性加 “-”
- 分组
- 找出同一集合中的重复数据
- 两个map合并
- 使用stream流去比较两个数组是否相等
- findFirst的使用
- findAny的使用
- String字符串转List数组
filter的使用
按条件对集合进行过滤
filter
中的test
方法返回true
代表当前元素会保留下来
// 针对文件名进行过滤
String pathName = "/usr/acro-data/";
File[] files = new File(pathName).listFiles();
List<File> fileList = Arrays.stream(files).filter(file -> file.getName().contains("-coa.pdf")).collect(Collectors.toList());
removeIf的使用
按条件对集合进行过滤
removeIf
中的test
方法返回true
代表当前元素会被过滤掉;
ArrayList<User> list = new ArrayList<>();
list.add(new User("张三", 22, "男"));
list.add(new User("李四", 19, "女"));
list.add(new User("王五", 34, "男"));
list.add(new User("赵六", 30, "男"));
list.add(new User("田七", 25, "女"));
list.removeIf(user -> user.getAge() >= 30);
去重
根据batchNo
去重
ArrayList<Map<String, Object>> list = batchList.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.get("batchNo").toString()))),
ArrayList::new));
给集合内对象属性加 “-”
String serialNum = StringUtils.join(subList.stream().map(e -> e.get("serialNumber")).toArray(), "-");
分组
// 有合同号的根据合同号 进行分组
Map<String, List<SaleOutOrderQuerySqlOutDto>> map2 = l2.stream().collect(Collectors.groupingBy(SaleOutOrderQuerySqlOutDto::getContractNo));
找出同一集合中的重复数据
// 分组, 计数
Map<String, Long> collect =
saveEntryDetailList.stream().map(EntryPlanDetailSqlInDto::getItemQrCode)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 存放重复二维码集合
List<String> repeatQrcodeList = new ArrayList<>();
for (Map.Entry<String, Long> entry : collect.entrySet()) {
if (entry.getValue() > 1) {
repeatQrcodeList.add(entry.getKey());
}
}
两个map合并
Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
使用stream流去比较两个数组是否相等
/** 先将集合转成stream流进行排序然后转成字符串进行比较 */
list.stream().sorted().collect(Collectors.joining())
.equals(list1.stream().sorted().collect(Collectors.joining()));
个人感觉先将集合转成字符串,然后进行equal(),进行判断是一个比较优秀的方法
list.sort(Comparator.comparing(String::hashCode));
list1.sort(Comparator.comparing(String::hashCode));
list.toString().equals(list1.toString());
findFirst的使用
findFirst是从流中找出第一个元素
List<UserInfo> list1 = Arrays.asList(
new UserInfo("小明", 18, "m", 80),
new UserInfo("小红", 16, "f", 81),
new UserInfo("小刚", 12, "m", 79),
new UserInfo("小熊", 11, "f", 94),
new UserInfo("小二", 10, "m", 68));
UserInfo userInfo = list1.stream().findFirst().get();
System.out.println(userInfo);
输出结果:UserInfo{name='小明', age=18, sex='m', score=80}
findAny的使用
findAny是从流中找出任意一个元素
List<String> stringList = Arrays.asList("aa", "bb", "cc", "dd", "ee");
for (int i = 0; i < 10; i++) {
String s = stringList.stream().findAny().get();
System.out.println(s);
}
输出结果:
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
怎么输出的结果一样呢?大家有没有注意到对“stringList”这个集合做流化处理使用的是“stream”,这是串行流。如果我们的“stringList”是有序的,那findAny的任意一个都是第一个了。
既然有串行流,那我们来试试并行流。
List<String> stringList = Arrays.asList("aa", "bb", "cc", "dd", "ee");
for (int i = 0; i < 10; i++) {
String s = stringList.parallelStream().findAny().get();
System.out.println(s);
}
输出结果:
cc
cc
cc
cc
cc
cc
bb
cc
cc
cc
这次的执行结果输出的不再都是第一个元素了,而是任意的一个元素了。有兴趣的朋友可以自己试着执行看看,每次执行的结果都可能会不同。
String字符串转List数组
String str = "00010000000000111000000000001000001";
List<Character> characterList = str.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
List<Character> subList = characterList.subList(0, 10);
subList.forEach(System.out::println);
List<Integer> collect = str.chars().boxed().collect(Collectors.toList());
最后
以上就是正直棉花糖为你收集整理的工作中常用的Stream流式处理数据的全部内容,希望文章能够帮你解决工作中常用的Stream流式处理数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复