Java8 中带有流的嵌套列表

新手上路,请多包涵

我有一个对象列表 A。此列表中的每个对象 A 都包含对象 B 的列表,对象 B 包含对象 C 的列表。对象 C 包含一个我想用来使用 java 8 进行过滤的属性名称。

如何使用流在 Java 8 中编写以下代码以避免嵌套循环:

 C c1 = null;
String name = "name1"
for (A a: listOfAObjects) {
    for (B b: a.getList()) {
        for (C c: b.getPr()) {
            if (c.getName().equalsIgnoreCase(name)) {
                c1= c;
                break;
            }
        }
    }
}

原文由 sk555 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 701
2 个回答

你可以使用两个 flatMap 然后一个 filter 然后你可以选择第一个或者如果没有结果返回 null

 C c1 = listOfAObjects.stream()
        .flatMap(a -> a.getList().stream())
        .flatMap(b -> b.getPr().stream())
        .filter(c -> c.getName().equalsIgnoreCase(name))
        .findFirst()
        .orElse(null);

原文由 Youcef Laidani 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 flatMap 来完成。

我用 Company 做了一个例子,其中包含一个列表 Person

 public static void main(String[] args) {
    List<Company> companies = Arrays.asList(
            new Company(Arrays.asList(new Person("Jon Skeet"), new Person("Linus Torvalds"))),
            new Company(Arrays.asList(new Person("Dennis Ritchie"), new Person("Bjarne Stroustrup"))),
            new Company(Arrays.asList(new Person("James Gosling"), new Person("Patrick Naughton")))
    );

    List<String> persons = companies.stream()
            .flatMap(company -> company.getPersons().stream())
            .map(Person::getName)
            .collect(Collectors.toList());

    System.out.println(persons);
}

输出 :

[乔恩·斯基特、莱纳斯·托沃兹、丹尼斯·里奇、比亚恩·斯特劳斯特鲁普、詹姆斯·高斯林、帕特里克·诺顿]

原文由 Arnaud Denoyelle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题