Предполагая, что я потребляю Поток сущностей из источника, который я не хочу материализовать, и я хочу и преобразовать элементы, и вернуть некоторое глобально уменьшенное значение, каков идиоматический способ с java (8)?
По сути, это попытка выполнить и reduce()
, и collect()
.
Пример:
class Person {
public String firstname,
public String lastname,
public int age;
}
class TeamSummary {
public List<String> fullnames, // firstname and lastname of all
public Person oldest
}
public TeamSummary getSummary(Stream<Person> personStream) {
final TeamSummary summary = new Summary();
summary.fullnames = personStream
.peek(p -> if (summary.getOldest() == null || summary.getOldest.age < p.age) {
summary.oldest = p;
})
.map(p -> p.firstname + ' ' + p.lastname)
.collect(toList());
return summary;
}
Выглядит уродливым взаимодействие с переменной вне потока внутриметод peek, но какие есть хорошие альтернативы, кажется, мне нужно объединить collect()
и reduce()
.
Хуже, если я хочу получить уменьшенное значение из всего потока (например, средний возраст)) и отфильтрованный список (например, лица старше 18 лет).Также становится хуже, если TeamSummary является неизменяемым классом и требуются дополнительные изменяемые переменные.
В таких случаях более идиоматично использовать цикл while в stream.iterator (), чтобы избежать объединения потоковых методов и переменных.?Или это естественно использовать сокращение к кортежу типа (самый старый, накопленный).
Я знаю, что этот вопрос является вопросом мнения, если не существует очевидного способа (например, специального сборщика), который решает это элегантно.