Как создать HashMap из flatMap? - PullRequest
1 голос
/ 20 мая 2019

У меня есть две Карты в методе param.

 private Map<String, List<Attr>> getPropAttr(Map<String, List<Attr>> redundantProperty,
                                                                       Map<String, List<Attr>> notEnoughProperty) {
        Map<String, List<Attr>> propAttr = new HashMap<>();
        redundantProperty.forEach((secondPropertyName, secondPropertyAttributes) -> notEnoughProperty.entrySet().stream()
                .filter(firstPropertyName -> secondPropertyName.contains(firstPropertyName.getKey()))
                .forEach(firstProperty -> {
                    List<Attr> firstPropertyAttrs = firstProperty.getValue();
                    List<Attr> redundantPropAttrs = getRedundantPropAttrs(secondPropertyAttrs, firstPropertyAttrs);

                    String propName = firstProperty.getKey();
                    propAttr.put(propertyName, redundantPropAttrs);
                }));
        return propAttr;

Я хочу переписать этот метод в потоковом режиме. Но у меня есть некоторые проблемы в потоковых коллекторах. Он не видит возвращаемое значение (список) из потока в плоскую карту. Ниже - моя попытка переписать этот метод на потоковом API. Как установить второй параметр в collect (toMap (first :: get, second :: get))? Спасибо заранее.

private Map<String, List<Attr>> getPropAttr(Map<String, List<Attr>> redundantProperty,
                                                                       Map<String, List<Attr>> notEnoughProperty) {
    return redundantProperty.entrySet().stream()
            .flatMap(secondProperty -> notEnoughProperty.entrySet().stream()
                    .filter(firstPropertyName -> secondProperty.getKey().contains(firstPropertyName.getKey()))
                    .map(firstProperty -> {
                        List<Attr> onlinePropertyAttrs = firstProperty.getValue();
                        List<Attr> redundantPropAttrs = 
                                getRedundantPropAttrs(secondProperty.getValue(), firstPropertyAttrs);
                        return redundantPropertyAttrs;
                    }))
            .collect(toMap(Property::getName, toList()));

1 Ответ

2 голосов
/ 20 мая 2019

После вашего flatMap звонка ваш Stream становится Stream<List<Attr>>.Похоже, что в этот момент вы теряете свойство, которое хотите использовать в качестве ключа для вывода Map.

Вместо этого я предлагаю, чтобы map внутри flatMap вернул Map.Entry, содержащий требуемый ключ и значение:

return redundantProperty.entrySet()
                       .stream()
                       .flatMap(secondProperty ->
                           notEnoughProperty.entrySet()
                                            .stream()
                                            .filter(firstPropertyName -> secondProperty.getKey().contains(firstPropertyName.getKey()))
                                            .map(firstProperty -> {
                                                List<Attr> redundantPropAttrs = ...
                                                ...
                                                return new SimpleEntry<String,List<Attr>>(firstProperty.getKey(),redundantPropertyAttrs);
                                            }))
                       .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
...