ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【进阶篇】利用 Stream 流对比两个集合的常用操作分享 [打印本页]

作者: 反转基因福娃    时间: 2024-5-27 08:38
标题: 【进阶篇】利用 Stream 流对比两个集合的常用操作分享
目录

前言

在之前的开发中,遇到了这样的需求:记录某个更新操作之前的数据作为日志内容,之后可以供管理员在页面上查看该日志。
思路:
经过短暂对比后,我选择方案2,理由如下:
要点:
一、集合的比力

详细情况可以分为:1、是否必要得到一个新的流?2、是否只必要一个简朴 boolean 结果?
我开发需求是要得到详细哪些数据不一样,以是选择返回一个新的流,只是得到一个 boolean 来判定是否相同是不敷的。
1.1必要得到一个新的流

图11.2只必要一个简朴 boolean 结果

二、简朴集合的对比

上述的集合都是泛型为自界说引用类型的集合,下面分享一些简朴集合,如整形、字符串类型集合的 Stream 流对比操作。
2.1整型元素集合
  1.         List<Integer> list1 = Arrays.asList(1, 6,);
  2.         List<Integer> list2 = Arrays.asList(3, 2, 1);
  3.         //Java 本身提供的 Integer 类已经实现了 Comparable 接口,可以直接.sort() 比较
  4.         boolean isEqual = list1.stream().sorted().collect(Collectors.toList())
  5.             .equals(list2.stream().sorted().collect(Collectors.toList()));
  6.         log.info("是否相等:{}", isEqual);
复制代码
2.2字符串元素集合
  1.         // 先排序然后转成 String 逗号分隔,joining()拼接
  2.         List<String> list3 = Arrays.asList("语文","数学","英语");
  3.         List<String> list4 = Arrays.asList("数学","英语","语文");
  4.         //Java 本身提供的 String 类也已经实现了 Comparable 接口
  5.         boolean flag = list3.stream().sorted().collect(Collectors.toList())
  6.             .equals(list4.stream().sorted().collect(Collectors.toList()));
  7.         log.info("是否相等:{}", flag);
复制代码
下面是简朴集合比力的运行结果,如图 4 所示:
   
  图42.3其它比力

不知道大家有没有发现,上述简朴类型的类可以直接比力,而自己写的类就不能,会报”cannot be cast to java.lang.Comparable“。
举个例子,对于自界说的引用类型 ListData , Java 不知道应该怎样为 ListData 的对象排序,是应该按名字排序? 还是按年龄来排序?
留意:.sort() 方法底层实现必要依赖 Comparator 接口,那么这个引用类型 ListData 类要自己手动去实现 Comparator() 接口并重写 compare() 方法才能这样做比力。
  1.         List<ListData> list1 = new ArrayList<>();
  2.         list1.add(new ListData("泛型为引用类型", 666, "abc"));
  3.         List<ListData> list2 = new ArrayList<>();
  4.         list2.add(new ListData("泛型为引用类型", 888, "def"));
  5.         //这里想要收集成为集合进行比较,需要先根据特定的元素排序(年龄),然后再按顺序比较
  6.         boolean flag = list1.stream().sorted(Comparator.comparing(ListData::getAge)).collect(Collectors.toList())
  7.                 .equals(list2.stream().sorted(Comparator.comparing(ListData::getAge)).collect(Collectors.toList()));
  8.         log.info("是否相等: {}", flag);
复制代码
三、Stream 基础回顾

Stream API 是 Java 8 中最为紧张的更新之一,是处置惩罚集合的关键抽象概念,也是每个 Java 后端开发人员都必须无条件掌握的内容。
Stream 和 Collection 集合的主要区别:Collection 是内存数据结构,重在数据的存储;而 Stream 是集合的操作计算,重在一系列的流式操作。
3.1基本概念

3.2 Stream 操作的三个步调

3.2.1创建 Stream

一个数据源(如:集合、数组)来获取一个流,详细有 3 种方式来创建:
3.2.2中心操作

每次处置惩罚都会返回一个持有结果的新 Stream,即中心操作的方法返回值仍旧是 Stream 类型的对象。因此中心操作可以是链式的,可对数据源的数据进行 n 次处置惩罚,但是在停止操作前,并不会真正执行;
中心操作可谓是最紧张也最常利用的操作,详细分为3种:筛选与切片、映射、排序,如以下表格所示:
<ul>筛选与切片
[table][tr]方法描 述[/tr][tr][td]Stream filter(Predicate




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4