如何使用流api从java中的两个列表创建列表

kulphzqa  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(346)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

13天前关门了。
改进这个问题
我有这些东西:

class Object1{
int id;
int Onject2id;
int Object3id;
...
}

class Object2{
int id;
...
}

class Object3{
int id;
...
}

我有两张单子 List<Object1> object1List 以及 List<int> object2IdList .
我想创建一个包含 object3Id 是哪个 object1Listobject2IdList . (对不起,我的语言不好)。我是说我想收集 Object3 来自的ID object1List 哪个 Object1Object2 中的ID object2IdList 使用流api(lambda表达式)。我以前做过嵌套for循环。但这不是一个最佳实践:

for (Integer object2Id  : object2IdList)
            for (Object1 object1 : object1List )
                if (object1.getObject2Id().equals(object2Id)) {
                    newList.add(object1.getObject3Id());
                    break;
                }

有什么建议吗?

slmsl1lt

slmsl1lt1#

准确的翻译 for loop 会导致

List<Integer> Object3IdList = object1List.stream()
                                             .filter(object1 -> object2IdList.stream()
                                                                             .anyMatch(i -> i.equals(object1.Object2Id)))
                                             .map(object1 -> object1.Object3id)
                                             .collect(Collectors.toList());

但这个在o(n^2)中运行。我们可以把这个列表转换成一个集合来提高效率。

Set<Integer> object2IdSet = new HashSet<>(object2IdList);

List<Integer> Object3IdList = object1List.stream()
                                         .filter(object1 -> object2IdSet.contains(object1.Object2Id))
                                         .map(object1 -> object1.Object3id)
                                         .collect(Collectors.toList());

相关问题