web-dev-qa-db-ja.com

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

2つのflatMapを使用し、次にfilterを使用できます。最初の1つを選択するか、結果がnullを返さない場合:

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

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

出力:

[ジョン・スキート、ライナス・トーバルズ、デニス・リッチー、ビャルン・ストラウストルプ、ジェームズ・ゴスリング、パトリック・ノートン]

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

同じタスクがありましたが、ネストされたクラスが1つありました。そして、ネストされたコレクションのフィルターでオブジェクトをフィルターする必要がありました。その結果、コレクション内で一致するアイテムを取得する必要がありました。

例:

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

それが誰かを助けることを願っています。

0