Вопрос-ответ

Java 8 List into Map

Java 8 перечисляет в карту

Я хочу преобразовать список объектов в карту, используя потоки Java 8 и лямбды.

Вот как я бы написал это в Java 7 и ниже.

private Map<String, Choice> nameMap(List<Choice> choices) {
final Map<String, Choice> hashMap = new HashMap<>();
for (final Choice choice : choices) {
hashMap.put(choice.getName(), choice);
}
return hashMap;
}

Я могу легко выполнить это, используя Java 8 и Guava, но я хотел бы знать, как это сделать без Guava.

В Guava:

private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, new Function<Choice, String>() {

@Override
public String apply(final Choice input) {
return input.getName();
}
});
}

И Guava с лямбдами Java 8.

private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, Choice::getName);
}
Переведено автоматически
Ответ 1

Основываясь на Collectors документации, это так просто, как:

Map<String, Choice> result =
choices.stream().collect(Collectors.toMap(Choice::getName,
Function.identity()));
Ответ 2

Если ваш ключ НЕ гарантированно уникален для всех элементов в списке, вам следует преобразовать его в Map<String, List<Choice>> вместо a Map<String, Choice>

Map<String, List<Choice>> result =
choices.stream().collect(Collectors.groupingBy(Choice::getName));
Ответ 3

Использовать getName() как ключ , а Choice себя как значение map:

Map<String, Choice> result =
choices.stream().collect(Collectors.toMap(Choice::getName, c -> c));
Ответ 4

В большинстве перечисленных ответов отсутствует случай, когда в списке есть повторяющиеся элементы. В этом случае их ответ приведет к ошибке IllegalStateException. Обратитесь к приведенному ниже коду , чтобы также обработать дубликаты списка:

public Map<String, Choice> convertListToMap(List<Choice> choices) {
return choices.stream()
.collect(Collectors.toMap(Choice::getName, choice -> choice,
(oldValue, newValue) -> newValue));
}
2023-11-27 17:24 java lambda java-8 java-stream