public static <T> T findPrevailingElement(Stream<T> ids) {
State s = new State(); // s.total is 0
Map<T, Long> counters = ids.peek(e -> ++s.total)
.collect(Collectors.groupingBy(Function.identity(), …));
for (Entry<T, Long> element : counters.entrySet()) {
if (element.getValue() >= (s.total + 1) / 2) {
return element.getKey();
}
}
throw new IllegalStateException(“no element occurs more than 50%”);
}