Могу ли я применить функцию к элементам списка и сохранить элемент списка и возвращаемое значение функции в паре ключ-значение, например, map, используя Java streams?

#java #collections #java-stream

#java #Коллекции #java-stream

Вопрос:

У меня есть список строк

 List <String> Ids = [id1, ids2, id3];
  

и функцию

 public List<String> getDays(String id) {
    // makes api call and fetch all the days in a list where id is present
    return list;
}
  

Теперь я хочу выполнить функцию getDays для каждого из элементов списка идентификаторов и сохранить его на карте

 Map<String, List<String> where String would be my Id from List(IDs) and 
List<String> would be the corresponding return value of getDays 
function on each Id
  

Как только я получу карту, я смогу использовать ее для дальнейших операций, таких как фильтрация или проверка моих идентификаторов, приходящихся на определенный день недели.

Я знаю, что это можно сделать с помощью цикла for, но мне больше интересно узнать, есть ли какой-либо другой метод, такой как streams или map utility.

Ответ №1:

Использовать Collectors.toMap

 public static void main(String[] args) {
    List<String> Ids = Arrays.asList("id1", "id2", "id3");
    Map<String, List<String>> result = Ids.stream().collect(Collectors.toMap(Function.identity(), MyClass::getDays));

    System.out.println(result); // {id2=[id2_foo, id2_bar], id1=[id1_foo, id1_bar], id3=[id3_foo, id3_bar]}
}

/* DEMO METHOD */
public static List<String> getDays(String id) {
    return Arrays.asList(id   "_foo", id   "_bar");
}
  

Может быть более понятным с помощью лямбда-обозначения

 Map<String, List<String>> result = Ids.stream()
                               .collect(Collectors.toMap(id->id, id -> getDays(id)));