Java 8 List <V>到Map <K,V> ? 推荐 | Java Debug 笔记

170 阅读1分钟

本文正在参加「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);
}

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

根据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的属性,方便扩展。

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️