我是靠谱客的博主 正直棉花糖,最近开发中收集的这篇文章主要介绍工作中常用的Stream流式处理数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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流式处理数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部