Преобразовать список в карту, которая считает вхождения


Я играю с Java 8 и знаю, что это должно быть возможно, читая документацию, я просто не могу понять, как это сделать.

У меня есть следующий рабочий код:

    long factorProduct = LongStream.rangeClosed(1, maxFactor)
            .filter(this::isOptimalFactor)
            .reduce((i, j) -> i * j)
            .getAsLong();
    List<Long> primeFactors = primeFactors(factorProduct);
Важная часть состоит в том, что у меня есть List<Long>, что может иметь дубликаты на некоторых Long числах.

Теперь я хочу преобразовать его в Map<Long, Long> с ключом элемента и значением события.

Я думал, что:

    Map<Long, Long> primeFactorCount = primeFactors.stream()
            .collect(Collectors.counting());

Сработало бы, но это не так. примеры в java.утиль.поток.Коллекционеры документации .

Как я должен использовать эти функции?

2 8

2 ответа:

Если вы хотите сгруппировать элементы, вы должны использовать groupingBy:

import static java.util.stream.Collectors.*;

Map<Long, Long> primeFactorCount = primeFactors.stream()
        .collect(groupingBy(p -> p, counting()));

Если вы используете коллекции Eclipse (ранее коллекции GS ), Вы можете использовать следующее для списка простых факторов и подсчета простых факторов. Сумка-это в основном Map<K, Integer>.

MutableList<Long> primeFactors = this.primeFactors(factorProduct); 
Bag<Long> primeFactorCount = primeFactors.toBag();

Используйте a FastList в методе primeFactors выше.

В случае коллекций Eclipse у нас есть примитивные списки и пакеты, поэтому вам не нужно будет упаковывать какие-либо результаты.

LongList primeFactors = this.primeFactors(factorProduct);   
LongBag primeFactorCount = primeFactors.toBag();

Используйте a LongArrayList вместо этого в методе primeFactors выше.

Примечание: я коммиттер для коллекций Eclipse.