Java применяет возвращаемый тип к универсальным типам вместо типов объектов для построения карты с использованием коллекторов и потоков - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь построить Map<String, GraphNode<Character>> из List<Pair<GraphNode<Character>, List<String>>> пар. Но проблема, с которой я сталкиваюсь, заключается в том, что она выдает ошибки, говорящие о том, что несоответствие типов: невозможно преобразовать из Map<Object,Object> в Map<String,GraphNode<Character>>.

Как мне заставить вернуться Map<String,GraphNode<Character>>

List<Pair<GraphNode<Character>, List<String>>> pairs = lines.stream().map(line -> {
            String[] split = line.split(":");
            List<String> dest = Lists
                    .newArrayList(Splitter.on(",").trimResults().omitEmptyStrings().splitToList(split[1]));
            GraphNode<Character> node = new GraphNode<>(split[0].toCharArray()[0]);
            return new javafx.util.Pair<GraphNode<Character>, List<String>>(node, dest);
        }).collect(Collectors.toList());
Map<String, GraphNode<Character>> graphMap = pairs.stream().map(pair -> pair.getKey())
                    .collect(Collectors.toMap(GraphNode::getData, pair -> pair));

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ваш шаг map неверен, поскольку вы отбрасываете данные в List<String> (часть значения Pair s), которую, как я предполагаю, вы хотели бы видеть в выходной карте. Я предлагаю использовать flatMap для преобразования Stream<Pair<GraphNode<Character>, List<String>>> в Stream<Pair<GraphNode<Character>, ListString>>. Оттуда получить Map<String, GraphNode<Character>> тривиально.

Map<String, GraphNode<Character>> graphMap =
    pairs.stream()
         .flatMap(pair->pair.getValue().stream().map(s -> new javafx.util.Pair<GraphNode<Character>, String>(pair.getKey(), s)))
         .collect(Collectors.toMap(Pair::getValue,Pair::getKey));
0 голосов
/ 04 мая 2018

Поскольку ваш класс имеет тип Character (GraphNode<Character>), поэтому я думаю, GraphNode::getData также возвращает Character связанный тип.

Но вы назначили его на String в Map<String, GraphNode<Character>>, чтобы произошло несоответствие типов.

Разрешение - сопоставить GraphNode::getData со строкой

...