Вложенные списки с потоками в 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;
}
}
}
}
3 ответов
вы можете использовать два flatMap
тогда a 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);
listOfObjectsA.stream()
.flatMap(a -> a.getListOfObjectsB.stream())
.flatMap(b -> b.getListOfObjectsC().stream())
.filter(c -> name.equals(c.getName()))
.findAny()
.orElse(....)
вы можете сделать это с помощью 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);
}
выход :
[Джон Скит, Лайнус Торвальдс, Деннис Ричи, Бьярне Страуструп, Джеймс Гослинг, Патрик Нотон]