Collectors: maxBy MinBy averagingInt summarizingDouble with Example
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class User {
private int cash;
private String name;
public User(int cash, String name) {
this.cash = cash;
this.name = name;
}
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [cash=" + cash + ", name=" + name + "]";
}
}
public class CollectorFindMaxFlight {
public static void main(String[] args) {
Stream<User> usersStream = getUsersStream();
Comparator<User> userComparator = Comparator.comparingInt(User::getCash);
Optional<User> maxCashUser = usersStream.collect(Collectors.maxBy(userComparator));
maxCashUser.ifPresent(user->System.out.println("Max Cash User: "+user));
usersStream = getUsersStream();
Optional<User> minCashUser = usersStream.collect(Collectors.minBy(userComparator));
minCashUser.ifPresent(user->System.out.println("Min Cash User: "+user));
usersStream = getUsersStream();
double avgCash = usersStream.collect(Collectors.averagingInt(User::getCash));
System.out.println("Average Cash: "+avgCash);
usersStream = getUsersStream();
DoubleSummaryStatistics summary = usersStream.collect(Collectors.summarizingDouble(User::getCash));
System.out.println("\n\nMax Cash: "+summary.getMax());
System.out.println("Min Cash: "+summary.getMin());
System.out.println("Avg Cash: "+summary.getAverage());
System.out.println("All Cash: "+summary.getSum());
System.out.println("Total Users: "+summary.getCount());
}
private static Stream<User> getUsersStream() {
Stream<User> usersStream = Stream.of(new User(1000, "u1"),
new User(1090, "u2"), new User(9000, "u3"),
new User(1100, "u4"), new User(1190, "u5"));
return usersStream;
}
}
Output:
Max Cash User: User [cash=9000, name=u3]
Min Cash User: User [cash=1000, name=u1]
Average Cash: 2676.0
Max Cash: 9000.0
Min Cash: 1000.0
Avg Cash: 2676.0
All Cash: 13380.0
Total Users: 5
Explanation:
Comparator.comparingInt: this mehod gives a compartor for the type of element to be compared.
Collectors.maxBy: Returns a max element from the stream according to the passed Comparator.
Collectors.minBy: returns a min element from the stream according to the given comparator.
Collectors.averagingInt: returna an average value of the passed parameters.
Collectors.summarizingDouble: returns an object of DoubleSummaryStatistics(IntSummaryStatistics, LongSummaryStatistics) with the statistics (min, max, avg, sum, count)