Java8中带有流的嵌套列表

时间:2018-08-01 09:54:55

标签: java list java-8 java-stream nested-loops

我有一个对象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;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:8)

您可以使用两个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);

答案 1 :(得分:1)

 listOfObjectsA.stream()
               .flatMap(a -> a.getListOfObjectsB.stream())
               .flatMap(b -> b.getListOfObjectsC().stream())
               .filter(c -> name.equals(c.getName()))
               .findAny()
               .orElse(....)

答案 2 :(得分:1)

您可以使用 String requestUrl = "https://api.gdc.cancer.gov/data/556e5e3f-0ab9-4b6c-aa62-c42f6a6cf20c"; URL url = new URL(requestUrl); InputStream in = url.openStream(); Files.copy(in, Paths.get("your_filename.pdf"), StandardCopyOption.REPLACE_EXISTING); in.close(); System.out.println("finished!"); 来做到这一点。

我以flatMap为例,其中包含Company的列表:

Person

输出:

  

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

答案 3 :(得分:0)

我有相同的任务,但是有一个嵌套的类。而且我不得不用嵌套集合中的filter过滤对象。 结果,我不得不获得在集合中具有匹配项的项目。

例如:

public class RootElement {
    private String name;
    private List<String> nestedElements;

    //getters / setters and constructors
}

使用元素初始化集合:

List<RootElement> elements = Arrays.asList(
                new RootElement("first", Arrays.asList("one", "two", "three")),
                new RootElement("second", Arrays.asList("four", "one", "two")));

过滤器示例:

String filterParam = "four";
        List<RootElement> filtered = elements.stream()
                .flatMap(root -> root.getNestedElements()
                        .stream()
                        .filter(nested -> nested.equalsIgnoreCase(filterParam))
                        .map(filteredElement -> new RootElement(root.getName(), root.getNestedElement())))
                .collect(Collectors.toList());

希望它将对某人有所帮助。