Как вызвать метод из коллектора в потоковой передаче Java 8? - PullRequest
2 голосов
/ 03 августа 2020

У меня есть фрагмент кода, который функционально работает так, как я хочу:

private Map<Florist, EnumSet<Flower>> localMethod(List<FlowerSellers> branchList) {
    Map<Florist, EnumSet<Flower>> availableFlowers = new EnumMap<>(Florist.class);

    branchList.stream()
              .filter(f -> f instanceof FlorestFranchised)
              .forEach(f -> availableFlowers.put(
                      FlorestHelperClass.florestTypeForKey(f.id()), 
                      ((FlorestFranchised) f).getFlowers()));

    return availableFlowers;
}

В качестве аргумента метод вспомогательного класса:

public static Florist FlorestTypeForKey(String id) {
    return FLOREST_MAP.get(id);
}

Я бы хотел чтобы сделать это с помощью сборщика, поэтому я хотел сделать это ...

return branchList.stream()
                 .filter(p -> p instanceof FlorestFranchised)
                 .map(p -> (FlorestFranchised) p)
                 .collect(Collectors.toMap(
                         FlorestFranchised::getId,  
                         FlorestFranchised::getFlowers));

Но, очевидно, это не удается, потому что он не выполняет поиск вспомогательного класса и поэтому вместо того, чтобы возвращать карту он возвращается

Это не удается:

return branchList.stream()
                 .filter(p -> p instanceof FlorestFranchised)
                 .map(p -> (FlorestFranchised) p)
                 .collect(Collectors.toMap(
                         FlorestHelperClass.florestTypeForKey(FlorestFranchised::getId),
                         FlorestFranchised::getFlowers));

Может ли кто-нибудь сказать мне, как мне вызывать методы поиска (FlorestHelperClass.florestTypeForKey) в сборщике? Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Collectors.toMap требует двух функций, создающих ключ и значение соответственно из значения, переданного в метод collect. Следовательно, вы можете сделать это:

return branchList.stream()
    .filter(p -> p instanceof FlorestFranchised)
    .map(p -> (FlorestFranchised) p)
    .collect(Collectors.toMap(
        p -> FlorestHelperClass.florestTypeForKey(p.getId()),   // key
        p -> p.getFlowers()                                     // value
));

Последнее лямбда-выражение можно заменить на FlorestFranchised::getFlowers.

2 голосов
/ 03 августа 2020

Вы можете отобразить сначала как пару AbstractMap.SimpleEntry, затем использовать Collectors.toMap

return branchList
    .stream()
    .filter(p -> p instanceof FlorestFranchised )
    .map(p -> (FlorestFranchised) p )
    .map(p -> new AbstractMap.SimpleEntry<>(
                 FlorestHelperClass.florestTypeForKey(p.getId()), p.getFlowers()))
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
...