java8多个list对象用lambda求差集

@RequiresPermissions("system:statistical:list")
@PostMapping("/getStuListNotClockIn/{orgIndexCode}/{accessTime}")
@ResponseBody
public TableDataInfo getStuListNotClockIn(@PathVariable String orgIndexCode,@PathVariable String accessTime)
{
    AttPrimary attPrimary = new AttPrimary();
    attPrimary.setOrgIndexCode(orgIndexCode);
    attPrimary.setAccessTime(accessTime);
    List<AttPrimary> attPrimaries = attPrimaryService.selectAttPrimaryList(attPrimary);
    Map stuList = HkApiPerson.getStuListByOrg("1","1000",orgIndexCode);
    JSONObject jsonObject = JSON.parseObject(JSONUtils.toJSONString(stuList));;
    List<AttPrimaryHk> stuListHk = JSON.parseArray(jsonObject.getString("list"), AttPrimaryHk.class);
    System.err.println(stuListHk);
    List distinctByUniqueList = stuListHk.stream()
            .filter(item -> !attPrimaries.stream()
                    .map(e -> e.getStuId())
                    .collect(Collectors.toList())
                    .contains(item.getPersonId()))
            .collect(Collectors.toList());
    return getDataTable(distinctByUniqueList);
}
<think>好的,用户想在Java中找到两个List的差,我得详细解答这个问题。首先,需要明确差的定义,通常是指存在于第一个列表但不在第二个列表中的元素。接下来,我应该考虑不同的实现方法,特别是Java 8之后的Stream API,因为用户提到的引用中多次提到了Stream和Lambda。 首先,要确认用户可能使用的Java版本。引用1和2提到Java 8及以后版本,所以重点放在Stream API上。另外,用户提供的引用中有使用filter和contains方法的例子,这可能是一种方法。不过,需要注意的是使用contains方法可能在列表较大时效率不高,因为contains的时间复杂度是O(n),导致整体复杂度为O(n^2)。如果用户处理的是大数据量,可能需要更高效的方法,比如先将第二个列表转换成Set,这样查找的时间复杂度可以降到O(1)。 然后,我需要给出两种方法:一种是使用Stream的filter和contains,另一种是先将第二个列表转为HashSet,再用Stream处理。这样用户可以根据实际情况选择。同时,需要提醒两种方法在处理重复元素时的差异,比如如果第一个列表有重复元素,是否需要保留,这会影响实现方式。 另外,引用3提到用Lambda求差操作,可能涉及多个列表的处理,但用户的问题是两个列表,所以可以暂时不展开。示例代码需要清晰,包括类定义和main方法,让用户可以直接运行测试。同时,要指出两种方法的优缺点,比如性能差异和重复元素的处理。 最后,用户可能需要知道差的应用场景,比如数据同步、过滤等,但问题中没有明确要求,可能不需要展开。不过,根据系统指令,需要生成相关问题,所以后续要添加相关问题部分,比如如何处理多个列表的差,或者如何求并、交等。 总结步骤:解释差概念,提供两种实现方法,示例代码,比较方法差异,注意事项,以及相关问题。</think>在Java中计算两个List的差(即存在于List1但不在List2中的元素),可以通过以下两种常用方法实现: --- ### **方法1:使用Stream API的`filter`与`contains`** **实现步骤**: 1. 将第二个列表转换为`HashSet`以提高查询效率(`contains`操作时间复杂度从$O(n)$降为$O(1)$) 2. 使用Stream过滤第一个列表中不在第二个合中的元素 **代码示例**: ```java import java.util.*; import java.util.stream.Collectors; public class ListDifference { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(3, 4, 5, 6, 7); // 差list1 - list2 Set<Integer> set2 = new HashSet<>(list2); List<Integer> difference = list1.stream() .filter(x -> !set2.contains(x)) .collect(Collectors.toList()); System.out.println("差: " + difference); // 输出 [1, 2] } } ``` --- ### **方法2:直接使用`filter`与`contains`(适用于小数据)** 若数据量较小,可直接用`list2.contains(x)`: ```java List<Integer> difference = list1.stream() .filter(x -> !list2.contains(x)) .collect(Collectors.toList()); ``` --- ### **两种方法的差异** | 方法 | 时间复杂度 | 适用场景 | 重复元素处理 | |--------|------------|------------------------|----------------------| | 方法1 | $O(n)$ | 大数据量 | 保留第一个列表的重复 | | 方法2 | $O(n^2)$ | 小数据量或列表已排序 | 保留第一个列表的重复 | --- ### **注意事项** 1. **元素唯一性**:如果第一个列表包含重复元素且需要保留,两种方法均可实现;若需要去重,可添加`.distinct()` 2. **对象比较**:若列表存储自定义对象,需重写`equals()`和`hashCode()`方法[^1] 3. **空值处理**:若列表可能包含`null`,需确保`contains`方法能正确处理 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值