工作中常用的Stream流式处理数据

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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值