使用Java8按ID列表从列表中获取所有对象

使用Java8按ID列表从列表中获取所有对象,java,java-8,Java,Java 8,我在一个列表中有一个代码列表,在另一个列表中有一个对象列表。我想从列表2中获取所有匹配的对象,其中代码出现在列表1中 例如: class A{ private String code; private String name; } List<A> list2; List<String> codeList; A类{ 私有字符串码; 私有字符串名称; } 清单2; 列表代码列表; 现在,我想要一个来自列表2的所有对象,用于代码列表中存在的所有代码。 我希望能够在这里使用J

我在一个列表中有一个代码列表,在另一个列表中有一个对象列表。我想从列表2中获取所有匹配的对象,其中代码出现在列表1中

例如:

class A{
private String code;
private String name;
}
List<A> list2;
List<String> codeList;
A类{
私有字符串码;
私有字符串名称;
}
清单2;
列表代码列表;
现在,我想要一个来自列表2的所有对象,用于代码列表中存在的所有代码。

我希望能够在这里使用Java streams来解决这个问题,而不是调用foreach代码并通过代码字符串上的equals方法获取对象。

您可以通过使用stream检查集合中的contains来创建集合和过滤器。
return list2.stream()
            .filter(listElement -> codeList.contains(listElement.getCode())
            .collect(Collectors.toList());
在集合中搜索的复杂性是恒定的,但在列表中搜索的复杂性是O(n)

Set Set=newhashset(代码列表);
List res=list2.stream()
.filter(e->set.contains(e.getCode())
.collect(Collectors.toList());

您尝试过什么吗?您想使用流有什么原因吗?据我所知,所有自然流解决方案的运行时间都是O(n²)。但是如果您对两个列表进行排序,然后同时对两个列表进行循环,则可以得到O(n log n)运行时间。也许有一种黑客方法可以通过streams实现这一点,但我无法想象一个干净的解决方案。根据项目的数量,最好使用集合而不是代码列表的列表。是的。也可以使用parallelStream()将其并行化以加快速度我怀疑一旦使用了集合,parallelStream是否会有很大的不同,但无论如何,您都必须进行基准测试。
Set<String> set = new HashSet<String>(codeList);
List<A> res = list2.stream()
            .filter(e -> set.contains(e.getCode())
            .collect(Collectors.toList());