本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
Java 8 List < V> 转换Map <K,V> ?
我想使用Java 8的流和lambda将对象列表转换为Map。
这就是我在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();
}
});
}
带有Java 8 lambda的guava。
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, Choice::getName);
}
高分回答:
根据Collectors文档,它很简单:
Map<String, Choice> result =
choices.stream().collect(Collectors.toMap(Choice::getName,
Function.identity()));
高分回答:
使用getName()的关键和Choice本身作为地图的价值:
Map<String, Choice> result =
choices.stream().collect(Collectors.toMap(Choice::getName, c -> c));`
高分回答
在Java 9中,版本1应该更快,因为它可以转换为invokedynamic调用。可以在JEP-280中找到更多详细信息:
这个想法是用对java.lang.invoke.StringConcatFactory的简单invokedynamic调用来替换整个StringBuilder追加操作,该调用将接受需要连接的值。
文章翻译自 yl2gl72eozkinivz3vc6swkesy-ac4c6men2g7xr2a-translate.translate.goog/questions/2…
作者建议:我也比较喜欢使用choices.stream().collect(Collectors.toMap(Choice::getName, c -> c))
既然已经提到泛型了,就简单扩展一下
"<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类"
public <T extends Comparable<? super T>> int[] sort(T[] a) {
return sort(a, null);
}
简单举例:假如?代表一个类Hand 它有一个父类Person 那么我们去比较一个属性,它有可能时Hand的属性,也有可能是Person的属性,方便扩展。
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️