【问题标题】:Comparing two list of objects and forming a new list by comparing one property of two list in java 8 [closed]通过比较java 8中两个列表的一个属性来比较两个对象列表并形成一个新列表[关闭]
【发布时间】:2019-09-01 22:27:32
【问题描述】:

我有两个对象列表。并且这个对象列表有一个共同的属性(例如:Id)。我想检查属性值,即;第一个列表和第二个列表的 id 相等,如果相等,则使用 java 8 创建一个新列表,其中仅包含具有相同属性值的对象。

我尝试过使用两个 for 循环。但我想在 java 8 中有解决方案

【问题讨论】:

  • 请用循环发布你的代码。

标签: java list java-stream


【解决方案1】:

这是一种可能的解决方案。 (未测试。)

假设列表是随机访问且长度相同,且列表元素和属性都不是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)。)

【讨论】:

  • 感谢您的回复。我的第一个列表说一个对象,第二个列表是另一种类型的对象。我拥有的第三个列表应该是对象列表(类似于第一个列表)。例如:我有一个列表 1 与 Listxyz=new ArrayList() 和列表 2 与 Listopl=新的 ArrayList() 。这两个都有一个属性 uniqueId。我需要第三个列表,因为 Abcbean hich 在两个列表中都有 uniqueId 相等。我的第三个列表应该是: Listlkj=new ArrayList();请帮帮我
  • 以上选项我累了,我得到了错误。错误:类型不匹配:无法从 xyzbean(第三个列表对象)转换为 int。请帮助我
【解决方案2】:

您希望在保存第一个列表类型的同时与列表相交。

获取 Set 中的公共字段值。

valuesToCheck=secondList.stream().map(SecondListObject::commonFiled).collect(Collectors.toList);

'''

在第一个应用流,同时根据上一步构建的集合中匹配的公共字段值进行过滤。

firstList.stream().filter(x->valuesToCheck.contains(x.getCommonFiled)).collect(toList)

你明白了要点。

【讨论】:

  • 非常感谢。这就是我要找的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多