Сопоставление <Строка, набор> преобразование в сопоставление строки с набором свойств одного из путей

#java #java-8 #java-stream

#java #java-8 #java-поток

Вопрос:

У меня есть объект пути, подобный этому:

 class Pathway {
  private dbId;
  private name;
}

 

Эти пути находятся в структуре карты гена, к набору всех путей, к которым принадлежит ген

Map<String, Set<Pathway>> geneToPathwayList;

Я хочу преобразовать это в карту Map<String, Set<String>> geneToPathwayDbId использования потоков.

Итак, чтобы сделать это, я пытаюсь выполнить итерацию по набору элементов карты, собирать ключи в качестве ключей, а затем собирать значения путем сопоставления набора путей с набором идентификаторов DBID, но я не могу получить правильный синтаксис. Вот как это выглядит в настоящее время:

 Map<String, Set<String>> finalMap = 
    geneToPathwayList.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey, 
            e -> e.stream().map(Pathway::getStId).collect(Collectors.toSet())));
 

Я зациклен на том, как выбирать e в качестве значения из каждой записи.

Любая помощь в решении этой проблемы была бы очень полезна!

Ответ №1:

похоже, вам нужно

 e -> e.getValue().stream().map(Pathway::getDbId).collect(Collectors.toSet())
 

Комментарии:

1. Это сработало для меня. Это странно, потому что eclipse не предлагал GetValue() в качестве допустимого вызова метода, но он все равно интерпретировался правильно. Я думаю, это был просто линтер, не знающий, чего я хотел. Спасибо!

2. @TimB. как бы то ни было, у IntelliJ, похоже, есть проблемы с тем же самым. Кажется, это немного сложно для IDE.

Ответ №2:

Альтернативное использование для каждого

 Map<String,Set<String>> finalMap = new HashMap<>();
   geneToPathwayList.forEach((k,v)-> 
           finalMap.put(k, v.stream().map(Pathway::getDbId).collect(Collectors.toSet())));