it-swarm.com.ru

Вложенные списки с потоками в 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;
            }
        }
    }
}
8
sk555

Вы можете использовать два 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);
8
YCF_L
 listOfObjectsA.stream()
               .flatMap(a -> a.getListOfObjectsB.stream())
               .flatMap(b -> b.getListOfObjectsC().stream())
               .filter(c -> name.equals(c.getName()))
               .findAny()
               .orElse(....)
1
Eugene

Вы можете сделать это с 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);
}

Результат : 

[Джон Скит, Линус Торвальдс, Деннис Ричи, Бьярн Страуструп, Джеймс Гослинг, Патрик Нотон]

1
Arnaud Denoyelle