Finding the keys of map with the highest values (equality may occur)
To use streams you'd have to make the score part of the object (at least on an intermediate level) so that you can find the maximum based on the score.

Here's a little example based on a string/string map and String.length() as score replacement (as I don't have your original objects). Should be sufficient to illustrate the idea:

    Map&lt;String, String&gt; m = ...

    Map&lt;Integer, List&lt;Entry&lt;String, String&gt;&gt;&gt; intermediateByScore = m.entrySet().stream()
        .collect(Collectors.groupingBy(e -&gt; e.getValue().length()));

    Entry&lt;Integer, List&lt;Entry&lt;String, String&gt;&gt;&gt; highest = intermediateByScore.entrySet().stream()
        .sorted((e1, e2) -&gt; e2.getKey().compareTo(e1.getKey()))
        .findFirst()
        .get();

    Map&lt;String, String&gt; result = highest.getValue().stream()
        .collect(Collectors.toMap(e -&gt; e.getKey(), e -&gt; e.getValue()));


... or, after a few inlines of intermediate variables:

    Map&lt;String, String&gt; result = m.entrySet().stream()
        .collect(Collectors.groupingBy(e -&gt; e.getValue().length()))
        .entrySet().stream()
        .sorted((e1, e2) -&gt; e2.getKey().compareTo(e1.getKey()))
        .findFirst()
        .get().getValue().stream()
        .collect(Collectors.toMap(e -&gt; e.getKey(), e -&gt; e.getValue()));


Is this better than the loop: I don't personally think so. My advice: stick to your loop or revise your data structures to better support this approach.