Я бы предложил вам использовать MoreCollectors
, определенный в StreamEx , или мою библиотеку abacus-util :
int result = Stream.of(1, 2, 12, 3, 4, 4, 55555, 12)
.collect(MoreCollectors.maxAll(MoreCollectors.countingInt()));
// map result
Map<Integer, Integer> mapResult = Stream.of(1, 2, 12, 3, 4, 4, 55555, 12)
.collect(maxAll(groupingBy(Function.identity(), countingInt())));
Потому что вы можете: 1) суммировать все самые большие числа, или 2) сопоставить их с чем-то другим, или 3) ... подробнее.
Не нужно и не следует писать такого рода конкретные коды только для одного конкретного пользовательского случая. (если вы хотите знать, как это реализовать, просто загрузите исходный код библиотек или декомпилируйте класс. Они опубликованы в Apache License v2)
Обновление . На самом деле я думаю, что, возможно, это неправильный вопрос, если вы говорите о числах, потому что традиционный for-loop
намного проще и эффективнее, чем использование лямбда-выражений:
int[] nums = {1, 2, 12, 3, 4, 4, 55555, 12, 55555};
int[] result = {Integer.MIN_VALUE, 0}; // [0] is the largest number if [1] (occurrence) is bigger than 0.
for (int num : nums) {
if (num > result[0]) {
result[0] = num;
result[1] = 1;
} else if (num == result[0]) {
result[1]++;
}
}
System.out.println(result[0] + ": " + result[1]);
если вам нужно перейти с Stream / Lambdas:
int[] result = IntStream.of(nums).collect(() -> new int[] {Integer.MIN_VALUE, 0}, (a, num) -> {
if (num > a[0]) {
a[0] = num;
a[1] = 1;
} else if (num == a[0]) {
a[1]++;
}
}, (a1, a2) -> {
if (a1[0] == a2[0]) {
a1[1] += a2[1];
} else if (a1[0] < a2[0]) {
a1[1] = a2[1];
}
});
System.out.println(result[0] + ": " + result[1]);