当前位置: 首页 > 知识库问答 >
问题:

Java8中带有流的嵌套列表

邵畅
2023-03-14

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

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

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;
            }
        }
    }
}

共有3个答案

花永昌
2023-03-14
 listOfObjectsA.stream()
               .flatMap(a -> a.getListOfObjectsB.stream())
               .flatMap(b -> b.getListOfObjectsC().stream())
               .filter(c -> name.equals(c.getName()))
               .findAny()
               .orElse(....)
吴嘉禧
2023-03-14

你可以用flatMap来做到这一点。

我用公司做了一个例子,其中包含一个人的列表:

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);
}

输出:

[Jon Skeet、Linus Torvalds、Dennis Ritchie、Bjarne Stroustrup、James Gosling、Patrick Naughton]

孔嘉茂
2023-03-14

您可以使用两个平面映射和一个过滤器,然后您可以选择第一个,或者如果没有结果返回 null

C c1 = listOfAObjects.stream()
        .flatMap(a -> a.getList().stream())
        .flatMap(b -> b.getPr().stream())
        .filter(c -> c.getName().equalsIgnoreCase(name))
        .findFirst()
        .orElse(null);
 类似资料:
  • 问题内容: 我有一个对象A的列表。此列表中的每个对象A都包含对象B的列表,而对象B包含对象C的列表。对象C包含一个属性名称,我想使用它使用Java 8进行过滤。 如何使用流在Java 8中编写以下代码以避免嵌套循环: 问题答案: 您可以使用两个,然后使用a,然后可以选择第一个,或者如果没有结果返回:

  • 我试图理解新的Java8流,并且花了好几天的时间在Java8流中的集合上传输嵌套的foreach循环。 是否可以重构以下嵌套的foreach循环,包括Java-8-Streams中的if条件? 如果是,它会是什么样子。 非常感谢你的帮助。 溴

  • jOOQ可以将查询结果映射到POJO中的多个嵌套列表吗?例如,我有一个POJO VM,它代表一个虚拟机。它具有'networks'属性,这是一个类型为network的列表。它还有一个'hdds'属性,这是一个类型为'hdd'的列表。该查询连接VM、HDD和Networks表。我是否可以“获取”到vm.class并期望jOOQ“做正确的事情”?

  • 我尝试在两个列表上循环,过滤嵌套列表,并使用java8特性将结果写回主对象。 因此,到目前为止,位置内部的子列表不会更改,这是显而易见的,因为流和收集确实会创建一个新列表,该列表不会写回位置对象中。所以我的问题是,如果有一种方法可以调用位置对象的setSubList(...)方法并将新列表写入其中。 感谢

  • 转换是否正确,或者是否有更好的方法将嵌套循环转换为流计算? 为什么流变体比旧变体慢得多? 为什么parallel()语句实际上将时间从0.19s增加到0.25s? 我知道微基准是脆弱的,并行性只有在遇到大问题时才值得,但对于CPU来说,即使是0.1秒也是永恒的,对吗? 更新 null