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)