Рассмотрим следующий класс POJO аннотированный с помощью Lombok примечаниямиJava 8 реферирования многократным предиката
@Setter
@Getter
@Builder
@ToString
public class User {
private String firstName;
private String lastName;
private Gender gender;
private Integer age;
private Integer points;
}
требование, чтобы получить LongSummaryStatistics
атрибута 'точек' для следующих предикатов:
Predicate<User> adultMenPredicate = user -> Gender.MALE == user.getGender && user.getAge()>18
Predicate<User> adultWomenPredicate = user -> Gender.FEMALE == user.getGender && user.getAge()>18
Predicate<User> minorPredicate = user -> user.getAge()<18
Моя текущая реализация является:
private LongSummaryStatistics getPointStats(List<User> users, Predicate<User> predicate) {
return users.stream().filter(predicate).mapToLong(User::getPoints).summaryStatistics();
}
System.out.println("point stats for adult men: " + getPointStats(users, adultMenPredicate));
System.out.println("point stats for adult women: " + getPointStats(users, adultWomenPredicate));
System.out.println("point stats for minors: " + getPointStats(users, minorPredicate));
Здесь мы перебор коллекции пользователи трижды. Можно ли это сделать всего за одну итерацию?
Не с потоками. С вычислительной точки зрения, операция итерации три раза по списку является постоянной, поэтому игнорируйте проблемы с производительностью. Держите его таким, как он, более читабельным и проверяемым. Если вы действительно (действительно) нуждаетесь в производительности, идите для каждого из них, создавая свою собственную статистику, а if-then-else в for-each – JeanValjean