@Shalom: wszystko się rozbija o znaczenie co to znaczy jeden stream. Dla mnie w tym wypadku to strumień danych źródłowych (czyli IntStream.of(arr)
). Żeby uniknąć wszelkiego rodzaju niedopowiedzeń to napisałem, że użycie tego ma dosyć ograniczoną sensowność.
Natomiast jeśli tak naprawdę nam zależy na unikaniu słówka kluczowego Stream to:
public static void main(String[] args) {
int[] arr = new int[]{1, 0, 2, 11, 3, 4, 7, 12, 20, 8};
AtomicInteger count = new AtomicInteger(0);
AtomicInteger sum = new AtomicInteger(0);
List<Integer> result = IntStream.of(arr)
.mapToObj(Integer::valueOf)
.peek(i -> { count.incrementAndGet(); })
.peek(i -> { sum.addAndGet(i); })
.collect(Collector.of(
() -> new ArrayList<Integer>(),
(list, value) -> list.add(value),
(list1, list2) -> { list1.addAll(list2); return list1; },
(list) -> {
double avg = sum.get()/(double) count.get();
list.removeIf(i -> i <= avg);
return list;
},
Collector.Characteristics.UNORDERED
));
result.forEach(System.out::println);
}