У меня есть следующие 2 формы вызова операции сбора, оба возвращают один и тот же результат, но я все еще не могу полностью зависеть от ссылок на методы и нуждаюсь в лямбда-выражении.
<R> R collect(Supplier<R> supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner)
Для этого рассмотрим следующий поток, состоящий из 100 случайных чисел
List<Double> dataList = new Random().doubles().limit(100).boxed()
.collect(Collectors.toList());
1) В следующем примере используются чистые лямбды
Map<Boolean, Integer> partition = dataList.stream()
.collect(() -> new ConcurrentHashMap<Boolean, Integer>(),
(map, x) ->
{
map.merge(x < 0.5 ? Boolean.TRUE : Boolean.FALSE, 1, Integer::sum);
}, (map, map2) ->
{
map2.putAll(map);
});
2) Следующие попыткииспользовать ссылки на методы, но для 2-го аргумента по-прежнему требуется лямбда
Map<Boolean, Integer> partition2 = dataList.stream()
.collect(ConcurrentHashMap<Boolean, Integer>::new,
(map, x) ->
{
map.merge(x < 0.5 ? Boolean.TRUE : Boolean.FALSE, 1, Integer::sum);
}, Map::putAll);
Как переписать 2-й аргумент метода сбора в java 8, чтобы использовать ссылку на метод вместо лямбда-выражения в этом примере?
System.out.println(partition.toString());
System.out.println(partition2.toString());
{false=55, true=45}
{false=55, true=45}