Дано - входящий массив; из которого нужно убрать все дубликаты и вернуть число, состоящее из оставшихся чисел массива. Реализовать нужно через Stream.
Пример - вошел массив {1, 2, 3, 2, 2, 3} - вернулось число 123.
Текущая реализация:
private static int minValue(int[] array) {
int[] noDuplicates = IntStream.of(array).distinct().toArray();
int result = 0;
for (int i = noDuplicates.length - 1, n = 0; i >= 0; --i, n++) {
int pos = (int) Math.pow(10, i);
result += noDuplicates[n] * pos;
}
return result;
}
Но нужно реализовать через один лишь Stream, без использования циклов. Точнее, используя терминальные операции, которые сводят stream чисел в одно число по заданному алгоритму. Прошу подсказать, как это реализовать
Как-то так?
Arrays.asList(1, 2, 3, 2, 2, 3).stream().distinct().map(Object::toString).collect(Collectors.joining()); // вернёт 123
Если результат нужен именно как int:
int res = Integer.valueOf(Arrays.asList(1, 2, 3, 2, 2, 3).stream().distinct().map(Object::toString).collect(Collectors.joining()));
Если без строк, то можно как-то так:
int res = Arrays.asList(1, 2, 3, 2, 2, 3)
.stream()
.distinct()
.reduce(0, (a,b) -> (a + b * (int)(a == 0 ? 1 :Math.pow(10, (int) (Math.log10(a) + 1)))));
Только на выходе будет 321. Остаётся только перевернуть.
int result = Stream.of(1, 2, 3, 2, 2, 3)
.distinct()
.reduce(0, (a,b) -> 10 * a + b);
Результат: 123.
Но это только для чисел меньших 10-ти, для чисел больших 10-ти немного сложнее:
int result = Stream.of(1, 123, 2, 3, 22, 2, 2, 3, 22, 10)
.distinct()
.reduce(0, (a,b) -> (int)Math.pow(10, (int)(Math.log10(b) + 1)) * a + b);
Результат: 1123232210.
Продвижение своими сайтами как стратегия роста и независимости