Для различения двух случаев, таких как i > 0
и i < 0
, мы можем использовать Stream.partition
:
Map<Boolean, List<Integer>> partitioned = list.stream()
.filter(i -> i != 0)
.collect(Collectors.partitioningBy(i -> i > 0));
ans[0] = partitioned.get(true).size();
ans[1] = partitioned.get(false).size();
Это упрощено?По крайней мере, он по-прежнему читабелен и прост для понимания.
РЕДАКТИРОВАТЬ
Или, как предлагает @ saka1029:
Map<Boolean, Long> partitioned = list.stream()
.filter(i -> i != 0)
.collect(Collectors.partitioningBy(i -> i > 0, Collectors.counting()));
ans[0] = partitioned.get(true);
ans[1] = partitioned.get(false);
РЕДАКТИРОВАТЬ
И еще одно решение Stream
, которое возвращает желаемоемассив.Но я бы сказал, что это не проще.Так что это сравнимо.
int[] ans = list.stream().filter(i -> i != 0).collect(
() -> new int[2],
(arr, i) -> arr[i > 0 ? 0 : 1]++,
(l, r) -> { l[0] += r[0]; l[1] += r[1]; });