Я хочу перевести Список объектов в Карту, используя потоки и лямбды 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.
В гуаве:
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();
}
});
}
И гуава с ява 8 лямбд.
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, Choice::getName);
}
java
lambda
java-8
java-stream
Том Камманн
источник
источник
Maps.uniqueIndex(choices, Choice::getName)
.Seq
из библиотеки JOOL (которую я бы порекомендовал любому, кто использует Java 8), вы также можете улучшить краткость с помощью:seq(choices).toMap(Choice::getName)
it -> it
себя.Function.identity()
используется здесь в основном потому, что он используется в ссылочной документации, и это было все, что я знал о лямбдах на момент написанияЕсли ваш ключ НЕ гарантированно уникален для всех элементов в списке, вы должны преобразовать его в
Map<String, List<Choice>>
вместоMap<String, Choice>
источник
Multimaps
метод гуавы лучше? Это может быть неудобно, так как не возвращаетMap
объект.Используйте
getName()
в качестве ключа иChoice
себя в качестве значения карты:источник
Collectors.toMap(Choice::getName,c->c)
(2 символа короче)choices.stream().collect(Collectors.toMap(choice -> choice.getName(),choice -> choice));
первой функции для ключа, второй функции для значенияc -> c
ноFunction.identity()
несет больше семантической информации. Я обычно использую статический импорт, чтобы я мог просто использоватьidentity()
Вот еще один случай, если вы не хотите использовать Collectors.toMap ()
источник
Collectors.toMap()
или наш собственный HashMap, как вы показали в примере выше?Большинство ответов в списке пропущено, если в списке есть повторяющиеся элементы . В таком случае там ответ кинет
IllegalStateException
. Обратитесь к приведенному ниже коду для обработки списков дубликатов :источник
источник
Например, если вы хотите преобразовать поля объекта в карту:
Пример объекта:
И операция преобразования списка на карту:
источник
Если вы не возражаете против использования сторонних библиотек, библиотека AOL cyclops-реагировать (раскрытие которой я являюсь автором) имеет расширения для всех типов JDK Collection , включая List и Map .
источник
Я пытался это сделать и обнаружил, что, используя приведенные выше ответы, при использовании
Functions.identity()
ключа для карты, у меня возникли проблемы с использованием локального метода, такого какthis::localMethodName
фактическая работа, из-за проблем с печатью.Functions.identity()
на самом деле что-то делает с типизацией в этом случае, поэтому метод будет работать только путем возвратаObject
и принятия параметраObject
Чтобы решить эту проблему, я в итоге бросил
Functions.identity()
и использовалs->s
вместо этого.Так что мой код, в моем случае, чтобы вывести список всех каталогов внутри каталога и для каждого из них использовать имя каталога в качестве ключа к карте, а затем вызвать метод с именем каталога и вернуть коллекцию элементов, выглядит следующим образом:
источник
Вы можете создать поток индексов, используя IntStream, а затем преобразовать их в карту:
источник
Я напишу, как преобразовать список в карту, используя дженерики и инверсию управления . Просто универсальный метод!
Может быть, у нас есть список целых чисел или список объектов. Таким образом, вопрос заключается в следующем: какой должен быть ключ карты?
создать интерфейс
Теперь с помощью инверсии управления:
Например, если у нас есть объекты книги, этот класс должен выбрать ключ для карты
источник
Я использую этот синтаксис
источник
groupingBy
создает, аMap<K,List<V>>
неMap<K,V>
.String getName();
(не целое число)источник
Это можно сделать двумя способами. Пусть человек будет тем классом, который мы будем использовать, чтобы продемонстрировать это.
Пусть лиц будет список людей, которые будут преобразованы в карту
1. Использование простого foreach и лямбда-выражения в списке
2. Использование коллекторов в потоке, определенных в данном списке.
источник
Для этого можно использовать потоки. Чтобы устранить необходимость явного использования
Collectors
, можно импортироватьtoMap
статически (в соответствии с рекомендациями Effective Java, третье издание).источник
Вот решение от StreamEx
источник
Даже служит этой цели для меня,
источник
Если каждое новое значение для того же имени ключа должно быть переопределено:
Если все варианты должны быть сгруппированы в списке по имени:
источник
источник
В качестве альтернативы
guava
можно использовать kotlin-stdlibисточник
Повторный ключ AA {12 = ASDFASDFASDF, 7 = EEDDDAD, 4 = CCCC, 3 = BBB, 2 = AA}
источник