I wrote following method to find the keys mapped to the highest values and trying to convert to java Stream
s. Can you please help?
private List<Integer> testStreamMap(Map<Integer, Long> mapGroup)
{
List<Integer> listMax = new ArrayList<Integer>();
Long frequency = 0L;
for (Integer key : mapGroup.keySet()) {
Long occurrence = mapGroup.get(key);
if (occurrence > frequency) {
listMax.clear();
listMax.add(key);
frequency = occurrence;
} else if (occurrence == frequency) {
listMax.add(key);
}
}
return listMax;
}
Integer max=mapGroup. entrySet(). stream(). max(Map.
2. Using Stream. max() method. The idea is to convert the list into a Stream and call Stream#max() that accepts a Comparator to compare items in the stream against each other to find the maximum element, and returns an Optional containing the maximum element in the stream according to the provided Comparator .
HashMap get() Method in Java HashMap. get() method of HashMap class is used to retrieve or fetch the value mapped by a particular key mentioned in the parameter. It returns NULL when the map contains no such mapping for the key.
Java 8 Stream's map method is intermediate operation and consumes single element forom input Stream and produces single element to output Stream. It simply used to convert Stream of one type to another. Let's see method signature of Stream's map method.
You can get a single key via
Integer max=mapGroup.entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey();
but unfortunately, there is no built-in function for getting all equivalent maximums.
The simplest, straight-forward solution is to find the maximum value first and retrieve all keys mapping to that value afterwards:
private List<Integer> testStreamMap(Map<Integer, Long> mapGroup) {
if(mapGroup.isEmpty())
return Collections.emptyList();
long max = mapGroup.values().stream().max(Comparator.naturalOrder()).get();
return mapGroup.entrySet().stream()
.filter(e -> e.getValue() == max)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
Solutions for getting all maximum values of a stream in a single pass, are discussed in “How to force max() to return ALL maximum values in a Java Stream?”. You will see that single-pass solutions are much more complicated and not worth the effort if your input is an ordinary Map
(e.g. HashMap
), which can be iterated multiple times cheaply.
I'm not sure what half your code is trying to do, but to answer your question as per the title, which I'm guessing was meant to be "find the entry with the highest value":
Map.Entry<Integer, Long> maxEntry = map.entrySet().stream()
.max(Map.Entry.comparingByValue()).get();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With