问题: Java 8 的List 转成 Map<K, V>

我想要使用Java 8的streams和lambdas转换一个 List 对象为 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;
}

我可以很轻松地用Java8和Guava搞定,但是呢我又不知道怎么不用Guava搞定

Guava写法:

private Map<String, Choice> nameMap(List<Choice> choices) {return Maps.uniqueIndex(choices, new Function<Choice, String>() {@Overridepublic String apply(final Choice input) {return input.getName();}});
}

Guava +Java 8 lambdas写法:

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()));

回答二

如果你的key不保证对于每个list中每个元素都是独一无二的,你就应该转换成Map<String, List>而不是Map<String, Choice>

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

回答三

用 getName() 作为 key 并且Choice 本身作为map的value:

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

回答四

上述的大部分回答的忽略了一种情况了就是当list有重复元素的时候。这种情况下就会抛出 IllegalStateException,参考下面的代码去处理重复的list元素吧

public Map<String, Choice> convertListToMap(List<Choice> choices) {return choices.stream().collect(Collectors.toMap(Choice::getName, choice -> choice,(oldValue, newValue) -> newValue));}

回答五

例如你想转换对象的一些域到map上:

对象是:

class Item{private String code;private String name;public Item(String code, String name) {this.code = code;this.name = name;}//getters and setters}

List 转 Map的操作是:

List<Item> list = new ArrayList<>();
list.add(new Item("code1", "name1"));
list.add(new Item("code2", "name2"));Map<String,String> map = list.stream().collect(Collectors.toMap(Item::getCode, Item::getName));

文章翻译自Stack Overflow:https://stackoverflow.com/questions/20363719/java-8-listv-into-mapk-v

Java 8 的List<V> 转成 Map<K, V>相关推荐

  1. Java反射之将对象转成map

    有时,我们在工程中需要将对象转成map 我们在objectToMap方法中传入对象参数,返回的就是map. ReflectUtil.java import java.lang.reflect.Fiel ...

  2. java string转map_Java string类型转换成map代码实例

    Java string类型转换成map代码实例 背景:有时候string类型的数据取出来是个很标准的key.value形式,通过Gson的可以直接转成map 使用方式: Gson gson = new ...

  3. Map(String ArrayList(Student))相关操作和遍历和利用Map(k v)统计字母出现次数

    public class MapSaveArrayListDemo {public static void main(String[] args) {//定义一个Mapy集合,且于存放ArrayLis ...

  4. JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性

    一.Map<K,V> Java提供了专⻔的集合类⽤来存放这种这种⼀⼀对应的关系,叫做映射对象,即 java.util.Map 接⼝. 类型参数: K - 此映射所维护的键的类型 V - 映 ...

  5. java 集合之Interface Map<K,V> HashMap实现类

    java 集合之Interface Map<K,V> 类型参数:K- 此映射所维护的键的类型:V- 映射值的类型 将键映射到值的对象. 一个映射不能包含重复的键: 每个键最多可以映射到一个 ...

  6. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    欢迎访问我的个人网站:https://bengtian.club 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度 ...

  7. Java集合框架概述(四)——Map体系集合与底层实现原理

    一.Map父接口 1.概要 方法 描述 public interface Map<K,V> 将键映射到值的对象. 一个映射不能包含重复的键; 每个键可以映射到最多一个值.  将键映射到值的 ...

  8. Java高级编程知识—8.2、Map接口

    文章目录 8.2.Map接口 1.1 Map接口 1.2 Map接口实现类 1.3 HashMap底层原理 JDK7 JDK8 1.4 LinkedHashMap底层原理 1.5 Collection ...

  9. Java中的集合(Collection,Map)

    集合类体系结构 Collection集合 Collection集合概述 是单例集合的顶层接口,它表示一组对象,这些对象也被成为Collection元素 JDK不提供此接口的任何直接实现,它提供更具体的 ...

最新文章

  1. 新盒模型移动端的排版
  2. Javascript:字符串分割split()妙用
  3. CountDownLatch 的使用小例
  4. ASP.NET 2.0 – 如何巢状化GridView控件
  5. 设置Table单元格颜色(Table篇三)
  6. satd残差_RDO、SAD、SATD、λ相关概念【转】
  7. Netty高性能之道
  8. dism++封装系统使用教程_【原创】最新WIN10系统封装教程2019系列(一)——定制母盘...
  9. 安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法
  10. 如何检测页面是否允许访问Cookie
  11. HDU5773(The All-purpose Zero LIS变形)
  12. Python汉字转拼音(xpinyin)
  13. windowsXPsp3恢复桌面IE图标
  14. 顶尖作者介绍 | 心理学领域研究“情绪”的大牛们有哪些?
  15. 【c语言】printf和scanf中* # %g的作用
  16. 算法租用游艇问题c语言,动态规划租用游艇问题
  17. 数据库系统概论:判别一个分解的无损连接性
  18. 如何计算俩日期相隔多少年,多少月,多少天或者两时间相差XX年XX月XX日
  19. win10 itunes更新ios系统异常 提示“未能恢复iPhone 发生未知错误(14)”
  20. 【百度地图】制作多途经点的线路导航,模拟运动 (vue,typescript)

热门文章

  1. 关于C++子类父类成员函数的覆盖和隐藏
  2. 三年经验java工资,含爱奇艺,小米,腾讯,阿里
  3. 温故而知新!微信小程序的事件处理,吊打面试官系列!
  4. 程序员经验分享:Android高级工程师系列学习路线介绍,面试必备
  5. ncbi查找目的基因序列_NCBI大搜索之目的基因寻踪
  6. SpringBoot与数据访问
  7. JDK 下载相关资料
  8. eclipse警告与报错的修复
  9. cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)
  10. 解决Failed to connect session for conifg 故障