2015-09-02 4 views
2

Учитывая, что мы имеем следующую функцию:Java 8 Струйные - Отображение карт

public Map<String, List<String>> mapListIt(List<Map<String, String>> input) { 
    Map<String, List<String>> results = new HashMap<>(); 
    List<String> things = Arrays.asList("foo", "bar", "baz"); 

    for (String thing : things) { 
     results.put(thing, input.stream() 
           .map(element -> element.get("id")) 
           .collect(Collectors.toList())); 
    } 

    return results; 
} 

Есть ли какой-то способ, которым я мог бы очистить это путем связывания "id" к опорному Map::get метод?

Есть ли способ создания потока в этом потоке?

+2

Я не понимаю цели этой функции. Он не компилируется, так как у вас нет закрывающего парса для results.put (если я добавляю его, он создает карту, где каждый элемент карты сопоставляется с тем же списком, созданным для каждого элемента. – WillShackleford

+1

Вероятно, элемент 'element -> .get (вещь) 'был предназначен. –

+0

С каждой карты в списке я хочу получить значение поля с ключом' 'id ''. Он написан по назначению. –

ответ

4

Насколько я могу судить, что эта функция возвращает карту из определенного списка строк в список всех элементов с ключом «id» в списке входных карт. Это верно?

Если так оно может быть существенно упрощено в качестве значения для всех ключей, будет то же самое:

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) { 
    List<String> ids = inputMaps.stream() 
     .map(m -> m.get("id")).collect(Collectors.toList()); 
    return Stream.of("foo", "bar", "baz") 
     .collect(Collectors.toMap(Function.identity(), s -> ids)); 
} 

Если вы хотите использовать ссылку метод (который моя интерпретация Вашего вопроса о «связывания») то вам нужен отдельный метод для ссылки:

private String getId(Map<String, String> map) { 
    return map.get("id"); 
} 

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) { 
    List<String> ids = inputMaps.stream() 
     .map(this::getId).collect(Collectors.toList()); 
    return Stream.of("foo", "bar", "baz") 
     .collect(Collectors.toMap(Function.identity(), s -> ids)); 
} 

Однако я предполагаю, что вы намеревались использовать элементы в списке как ключи (а не «ID»), в этом случае:

public Map<String, List<String>> weirdMapFunction(List<Map<String, String>> inputMaps) { 
    return Stream.of("foo", "bar", "baz") 
     .collect(Collectors.toMap(Function.identity(), s -> inputMaps.stream() 
      .map(m -> m.get(s)).collect(Collectors.toList()))); 
} 
+0

В первом случае вы были верны! Я искал. Спасибо! –

Смежные вопросы