Java Lambda表达式对象集合交集,差集,去重

这篇博客探讨了如何使用Java集合流API来处理数据列表的变化。通过比较两个User对象列表,分别获取了修改、删除、新增的用户列表,并实现了列表的交集和去重操作。这种方法在数据同步和更新场景中非常实用。

1、第一种

//从数据库取的数据
List<User> saleTaskItemOldList = new ArrayList<>();
 
//从前端修改的数据
List<User> saleTaskItemNewList = new ArrayList<>();
 
//修改的
List<User> updateOldList = saleTaskItemNewList.stream()
                            .filter(item -> saleTaskItemOldList.stream()
                            .map(e -> e.getName())
                            .collect(Collectors.toList())
                            .contains(item.getName()))
                            .collect(Collectors.toList());
 
//删除的
List<User> deleteOldList = saleTaskItemOldList.stream()
                            .filter(item -> !saleTaskItemNewList.stream()
                            .map(e -> e.getName())
                            .collect(Collectors.toList())
                            .contains(item.getName()))
                            .collect(Collectors.toList());
 
//新的
List<User> newList = saleTaskItemNewList.stream()
                            .filter(item -> !saleTaskItemOldList.stream()
                            .map(e -> e.getName())
                            .collect(Collectors.toList())
                            .contains(item.getName()))
                            .collect(Collectors.toList());

//交集
List<User> sameList = saleTaskItemNewList.stream()
							.filter(u1-> saleTaskItemOldList.contains(u1))
							.collect(Collectors.toList());

//去重
List<User> userList = list1.stream()
		.collect(Collectors.collectingAndThen(
		Collectors.toCollection(() -> new TreeSet<>(
		Comparator.comparing(user -> user.getName()))), ArrayList::new));

2、第二种

//从数据库取的数据
List<User> saleTaskItemOldList = new ArrayList<>();
 
//从前端修改的数据
List<User> saleTaskItemNewList = new ArrayList<>();
 
//修改的
List<User> updateOldList = saleTaskItemNewList.stream()
							.filter(u1-> saleTaskItemOldList.contains(u1))
							.collect(Collectors.toList());
 
//删除的
List<User> deleteOldList = saleTaskItemOldList.stream()
							.filter(u1-> !saleTaskItemNewList.contains(u1))
							.collect(Collectors.toList());
 
//新的
List<User> newList = saleTaskItemNewList.stream()
							.filter(u1-> !saleTaskItemOldList.contains(u1))
							.collect(Collectors.toList());

总结:使用对象中的属性比较精确,直接使用对象本身也是没问题的。

<think>好的,我需要帮助用户找到在Java中使用Lambda表达式计算集合交集的方法。用户已经提供了三个引用,我需要仔细查看这些引用中是否有相关的信息。 首先看引用[1],提到了使用reduce函数进行累加操作,这可能与集合操作有关,但主要是累加,不是交集。引用[2]中使用了groupingBy分组,这可能涉及集合的处理,但同样不是交集。引用[3]详细介绍了集合Lambda表达式,提到了Collection的常用方法,比如addAll、removeAll等,特别是removeAll方法可以用于求差集,这可能与求交集有关联。因为集合交集可以通过保留集合中都存在的元素来实现,而差集可能用于辅助计算。 通常,计算集合交集可以通过retainAll方法,但这个方法会修改原集合。如果用户希望使用Lambda表达式,可能需要另一种方式,比如流式处理。结合引用[3]中的方法,可能的步骤是:将其中一个集合转换为流,过滤出存在于另一个集合中的元素,然后收集结果。例如,使用filter和contains方法结合。 另外,Java 8的Stream API中有没有更直接的方法呢?比如使用Stream的filter和Collectors.toList()来收集交集元素。例如,list1.stream().filter(list2::contains).collect(Collectors.toList())。这样就能得到集合交集。 不过需要考虑效率问题,因为使用contains方法在列表的情况下是O(n)复杂度,如果集合较大,可能会影响性能。因此,更好的做法可能是先将其中一个集合转换为Set,这样contains操作的时间复杂度为O(1)。例如: Set<T> set = new HashSet<>(list2); List<T> intersection = list1.stream().filter(set::contains).collect(Collectors.toList()); 这样处理可以提高效率。用户提供的引用中没有直接提到这种方法,但引用[3]提到了Map和Set的特性,可以推断出使用Set优化查找速度。 因此,正确的Lambda表达式计算交集的方法应该是利用流式处理,结合Set来优化性能。同时,需要确保元素的equals和hashCode方法正确实现,以便正确判断元素是否存在于另一个集合中。 最后,验证示例代码的正确性,确保语法正确,比如使用正确的泛型类型和Stream方法。示例代码应该清晰展示如何通过Lambda表达式实现交集计算,并且提到可能的性能优化方法。</think>在Java中使用Lambda表达式计算集合交集可以通过流式操作结合`filter`方法实现。以下为具体实现方法和示例代码: ### 实现步骤 1. **转换为流**:将其中一个集合转换为流 2. **过滤元素**:使用`filter`方法筛选出同时存在于另一个集合中的元素 3. **收集结果**:将过滤后的元素收集到新集合中 $$时间复杂度优化公式:O(n) = n + m \quad (若使用HashSet)$$ ### 示例代码 ```java import java.util.*; import java.util.stream.Collectors; public class IntersectionExample { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4); List<Integer> list2 = Arrays.asList(3, 4, 5, 6); // 将第二个集合转为Set提高查询效率[^3] Set<Integer> set2 = new HashSet<>(list2); List<Integer> intersection = list1.stream() .filter(set2::contains) .collect(Collectors.toList()); System.out.println("交集结果:" + intersection); // 输出[3, 4] } } ``` ### 关键说明 1. **性能优化**:通过将第二个集合转换为`HashSet`,将`contains`操作的时间复杂度从$O(n)$降低到$O(1)$ 2. **元素比较**:依赖对象的`equals()`和`hashCode()`方法进行元素比对 3. **保持顺序**:若需要保留原始顺序,建议使用`LinkedHashSet`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值