Java8 将一个List<T>转为Map<String,T>的操作

将 List 转为 Map<String, T>

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List<String> names = Lists.newArrayList("Answer", "AnswerAIL", "AI");
  Map<String, Integer> map = names.stream().collect(Collectors.toMap(v -> v, v -> 1));
  System.out.println(map);
 }
}

程序运行输出

{Answer=1, AnswerAIL=1, AI=1}

将 List 转为 Map<K, V>

public static void main(String[] args) throws Exception {
 List<User> users = new ArrayList<>();
 for (int i = 0; i < 3; i++) {
  users.add(new User("answer" + i, new Random().nextInt(100)));
 }
 System.out.println(JSON.toJSONString(users));
 System.out.println();
 Map<String, Integer> map = users.stream().collect(Collectors.toMap(User::getName, User::getAge));
 System.out.println(map);
}

程序运行输出

[{"age":78,"name":"answer0"},{"age":89,"name":"answer1"},{"age":72,"name":"answer2"}]
{answer2=72, answer1=89, answer0=78}

将 List 转为 Map<String, T>

实现方式1

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List<User> users = new ArrayList<>();
  for (int i = 0; i < 3; i++) {
   // 改为此代码, 转map时会报错 Duplicate key User
 // users.add(new User("answer", new Random().nextInt(100)));
   users.add(new User("answer" + i, new Random().nextInt(100)));
  }
  System.out.println(JSON.toJSONString(users));
  System.out.println();
  Map<String, User> map = users.stream().collect(Collectors.toMap(User::getName, Function.identity()));
  System.out.println(JSON.toJSONString(map));
 }
}

该方式如果 map 的 key(如上述例子的 User::getName 的值) 重复, 会抛错java.lang.IllegalStateException: Duplicate key User

程序运行输出

[{"age":22,"name":"answer0"},{"age":79,"name":"answer1"},{"age":81,"name":"answer2"}]
{"answer2":{"age":81,"name":"answer2"},"answer1":{"age":79,"name":"answer1"},"answer0":{"age":22,"name":"answer0"}}

实现方式2

public class AnswerApp {
 public static void main(String[] args) throws Exception {
  List<User> users = new ArrayList<>();
  for (int i = 0; i < 3; i++) {
   users.add(new User("answer", new Random().nextInt(100)));
  }
  System.out.println(JSON.toJSONString(users));
  System.out.println();

 // 如果 key 重复, 则根据 冲突方法 ·(key1, key2) -> key2· 判断. 解释: key1 key2 冲突时 取 key2
  Map<String, User> map = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key2));
  System.out.println(JSON.toJSONString(map));
 }
}

程序运行输出

[{"age":24,"name":"answer"},{"age":89,"name":"answer"},{"age":68,"name":"answer"}]
{"answer":{"age":68,"name":"answer"}}

如果改为 (key1, key2) -> key1 则输出 {"answer":{"age":24,"name":"answer"}}

User 实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
 private Long id;
 private String name;
 private Integer age;
 public User(String name) {
  this.name = name;
 }
 public User(String name, Integer age) {
  this.name = name;
  this.age = age;
 }
}

补充:java8中使用Lambda表达式将list中实体类的两个字段转Map

代码:

List<Entity> list = new ArrayList<>();
Map<Integer, String> map = list.stream().collect(Collectors.toMap(Entity::getId, Entity::getType));

常用的lambda表达式:

**
 * List -> Map
 * 需要注意的是:
 * toMap 如果集合对象有重复的key,会报错Duplicate key ....
 * apple1,apple12的id都为1。
 * 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
 */
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));

安照某一字段去重
list = list.stream().filter(distinctByKey(p -> ((ModCreditColumn) p).getFieldCode())).collect(Collectors.toList());

List<Double> unitNetValue = listIncreaseDto.stream().map(IncreaseDto :: getUnitNetValue).collect(Collectors.toList());

//求和 对象List
BigDecimal allFullMarketPrice = entityList.stream().filter(value -> value.getFullMarketPrice()!= null).map(SceneAnalysisRespVo::getFullMarketPrice).reduce(BigDecimal.ZERO, BigDecimal::add);

 List<BigDecimal> naturalDayList;
 BigDecimal total = naturalDayList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

分组函数
Map<String, List<SceneAnalysisRespVo>> groupMap = total.getGroupList().stream().collect(Collectors.groupingBy(SceneAnalysisRespVo::getVmName));

//DV01之和
BigDecimal allDV01 = values.stream().filter(sceneAnalysisRespVo -> sceneAnalysisRespVo.getDv() != null).map(SceneAnalysisRespVo::getDv).reduce(BigDecimal.ZERO, BigDecimal::add);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 详解Java8新特性Stream之list转map及问题解决

    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List<Person> list = new ArrayList(); list.add(new Person("1001", "小A")); list.add(new Person("1002", "小B")); list.add(new Person

  • Java8 实现stream将对象集合list中抽取属性集合转化为map或list

    首先新建一个实体类Person @Data public class Person { /** 编码 */ private String code; /** 名字 */ private String name; public Person(String code, String name) { this.code = code; this.name = name; } } 实例化三个对象放入list集合中 public static void main(String[] args) { Pers

  • java8快速实现List转map 、分组、过滤等操作

    利用java8新特性,可以用简洁高效的代码来实现一些数据处理. 定义1个Apple对象: public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer id, String name, BigDecimal money, Integer num) { this.id = id; this.name =

  • Java8 将一个List<T>转为Map<String,T>的操作

    将 List 转为 Map<String, T> public class AnswerApp { public static void main(String[] args) throws Exception { List<String> names = Lists.newArrayList("Answer", "AnswerAIL", "AI"); Map<String, Integer> map = na

  • java8时间 yyyyMMddHHmmss格式转为日期的代码

    我就废话不多说了,大家还是直接看代码吧~ String datetime = "20140212111012"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); LocalDateTime ldt = LocalDateTime.parse(datetime,dtf); System.out.println(ldt); DateTimeFormatter fa = Date

  • java8中Map的一些骚操作总结

    一 前言 本篇内容是关于 map 新特性的一些方法使用上的介绍,如果有不足之处欢迎补充!! 二 map新特性 关于以下函数式编程的函数的计算知识追寻者都使用 简单字符串代替了,参数无非就是Key,value: 2.1 forEach forEach迭代,相当于for循环 public static void main(String[] args) { HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put(&qu

  • Java8中利用stream对map集合进行过滤的方法

    前言 Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常见计算等. 最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 原有方法说明 主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作 这

  • golang语言如何将interface转为int, string,slice,struct等类型

    在golang中,interface{}允许接纳任意值,int,string,struct,slice等,因此我可以很简单的将值传递到interface{},例如: package main import ( "fmt" ) type User struct{ Name string } func main() { any := User{ Name: "fidding", } test(any) any2 := "fidding" test(a

  • mybatis查询返回Map<String,Object>类型的讲解

    目录 查询返回Map<String,Object>类型 mybatis返回结果为Map问题 查询返回Map<String,Object>类型 mybatis 查询返回Map<String,Object> 类型,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此类问题. Mapper.java中的方法: @MapKey("userId") Map<String,UserInfo> personalInfoByUserIds(Lis

  • Mybatis查询返回Map<String,Object>类型实例详解

    这篇我们来说一下Mybatis的查询结果返回Map类型. 首先我们在企业开发中是很少使用到Map返回类型的,很多都是直接返回一个对象实体.尤其是苞米豆出了MP框架之后,XML都是很少写的. 那么在什么情况下需要使用Map来作为返回的结果类型呢? 案例:有一个模块A和模块B,A模块的POM依赖引入了B模块,A模块可以直接使用B模块的实体,但是B模块使用不到A模块的实体,如果在B模块POM中引入A模块的依赖,那么在运行时会出现依赖循环错误,这时候就需要自己写SQL来返回Map类型了,因为返回不了另一

  • golang针对map的判断,删除操作示例

    本文实例讲述了golang针对map的判断,删除操作.分享给大家供大家参考,具体如下: map是一种key-value的关系,一般都会使用make来初始化内存,有助于减少后续新增操作的内存分配次数.假如一开始定义了话,但没有用make来初始化,会报错的. 复制代码 代码如下: package main import ( "fmt" ) func main(){ var test =  map[string]string{"姓名":"李四",&qu

  • java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN,搜索关键字"附录1-JS-SDK使用权限签名算法" import java.util.ArrayList; import java.util.Collectio

  • java8 多个list对象用lambda求差集操作

    业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户. 调用接口获取的数据集合 List<AccountVo> list = response.getData().getItems(); 本地查询出来的账户集合 List<Account> towList = accountRepository.findAll(); 筛选差集代码 List<AccountVo> distinctByUniqueList = list

随机推荐