sekhar :
How do I get result set as {GERMANY=3} instead of {GERMANY=3, POLAND=2, UK=3}
public class Student {
private final String name;
private final int age;
private final Country country;
private final int score;
// getters and setters (omitted for brevity)
}
public enum Country { POLAND, UK, GERMANY }
//Consider below code snippet
public static void main(String[] args) {
List<Student> students = Arrays.asList(
/* NAME AGE COUNTRY SCORE */
new Student("Jan", 13, Country.POLAND, 92),
new Student("Anna", 15, Country.POLAND, 95),
new Student("Helga", 14, Country.GERMANY, 93),
new Student("Leon", 14, Country.GERMANY, 97),
new Student("Chris", 15, Country.GERMANY, 97),
new Student("Michael", 14, Country.UK, 90),
new Student("Tim", 15, Country.UK, 91),
new Student("George", 14, Country.UK, 98)
);
// Java 8 code to get all countries code but
// How do I get the only country that has maximum students from ArrayList given above.
Map<Country, Long> numberOfStudentsByCountry =
students.stream()
.collect(groupingBy(Student::getCountry, counting()));
System.out.println(numberOfStudentsByCountry);
}
The outcome as given below
{GERMANY=3, POLAND=2, UK=3}
I want like below.
{GERMANY=3}
Naman :
You can further get the most frequent country in the map using Stream.max
comparing on the values as:
Country mostFrequent = numberOfStudentsByCountry.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse(Country.POLAND) // some default country
If you're interested in just a single Map.Entry
, you can use
Map.Entry<Country,Long> mostFrequentEntry = numberOfStudentsByCountry.entrySet()
.stream()
.max(Map.Entry.comparingByValue()) // extensible here
.orElse(null); // you can default according to service
Note: Both these should be extensible enough to add to the Comparator
a custom logic when you want to break the tie such as frequency being equal for two countries. Just for example say, this can happen between GERMANY and UK in the sample data.