【发布时间】:2019-09-01 22:27:32
【问题描述】:
我有两个对象列表。并且这个对象列表有一个共同的属性(例如:Id)。我想检查属性值,即;第一个列表和第二个列表的 id 相等,如果相等,则使用 java 8 创建一个新列表,其中仅包含具有相同属性值的对象。
我尝试过使用两个 for 循环。但我想在 java 8 中有解决方案
【问题讨论】:
-
请用循环发布你的代码。
标签: java list java-stream
我有两个对象列表。并且这个对象列表有一个共同的属性(例如:Id)。我想检查属性值,即;第一个列表和第二个列表的 id 相等,如果相等,则使用 java 8 创建一个新列表,其中仅包含具有相同属性值的对象。
我尝试过使用两个 for 循环。但我想在 java 8 中有解决方案
【问题讨论】:
标签: java list java-stream
这是一种可能的解决方案。 (未测试。)
假设列表是随机访问且长度相同,且列表元素和属性都不是null:
List<SomeType> list1 = ...
List<SomeType> list2 = ...
List<SomeType> res =
IntStream.range(0, list1.size())
.filter(i -> list1.get(i).getSomeProp().equals(list2.get(i).getSomeProp()))
.map(i -> list1.get(i))
.Collectors.toList();
(如果列表不是随机访问,这也可以,但它将是O(N^2)。)
【讨论】:
您希望在保存第一个列表类型的同时与列表相交。
获取 Set 中的公共字段值。
valuesToCheck=secondList.stream().map(SecondListObject::commonFiled).collect(Collectors.toList);
'''
在第一个应用流,同时根据上一步构建的集合中匹配的公共字段值进行过滤。
firstList.stream().filter(x->valuesToCheck.contains(x.getCommonFiled)).collect(toList)
你明白了要点。
【讨论】: