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) {
 Person person1 = new Person("001", "张三");
 Person person2 = new Person("002", "李四");
 Person person3 = new Person("002", "王五");
 List<Person> personList = new ArrayList<>();
 personList.add(person1);
 personList.add(person2);
 personList.add(person3);
 personList.forEach(t -> System.out.println(t.toString()));
}

输出结果为:

Person(code=001, name=张三)

Person(code=002, name=李四)

Person(code=002, name=王五)

1.抽取对象的code作为key,name作为value转化为map集合

方法为

private static HashMap<String, String> listToMap(List<Person> personList) {
 return (HashMap<String, String>)personList.stream()
   .filter(t -> t.getName()!=null)
   .collect(Collectors.toMap(Person::getCode,Person::getName,(k1,k2)->k2));
}

filter() 方法作用是过滤掉名字为空的对象,当对象的名字为null时,会出现NPE空指针异常

(k1,k2)->k2 意思是遇到相同的key时取第二个值

(k1,k2)->k1 意思是遇到相同的key时取第一个值

调用这个方法

HashMap<String,String> personMap = listToMap(personList);
personMap.forEach((k,v)-> System.out.println(k.toString() + " - " + v.toString()));

输出结果为:

001 - 张三

002 - 王五

2.抽取对象的name得到name的list集合

方法为

private static List<String> getNameList(List<Person> personList) {
 return personList.stream().map(Person::getName).collect(Collectors.toList());
}

调用这个方法

List<String> nameList = getNameList(personList);
nameList.forEach(t -> System.out.println(t.toString()));

输出结果为:

张三

李四

王五

补充:java8 使用stream将List转成Map,或者从List对象中获取单个属性List,List中根据某个字段排序

1.学生类

import lombok.Data;
@Data
public class Student{
 private String stuId;
 private String name;
 private String age;
 private String sex;
}

2.测试类

public class Test {
 public static void main(String[] args) {

  // 创建学生List
  List<Student> list = createStudentList();

  // 1.获取value为Student对象,key为学生ID的Map
  getStudentObjectMap(list);

  // 2.获取value为学生姓名,key为学生ID的Map
  getStudentNameMap(list);

  // 3.获取学生姓名List
  getStudentNameList(list);

  //4.List中删除学生id = 1的对象

  list.removeIf(student -> student.getStuId().equals(1));

  //5.如果StudentId为Long类型如何转?

  Map<String, String> mapStr = list.stream().collect(Collectors.toMap(student -> student.getStuId().toString(), student -> JSON.toJSONString(student)));

  //6.根据List中Student的学生姓名排序
  Collections.sort(list, (o1, o2) -> {
   if (o1.getName().compareTo(o2.getName()) > 0) {
    return 1;
   } else if (o1.getName().compareTo(o2.getName()) < 0) {
    return -1;
   } else {
    return 0;
   }
  });
  //7.List遍历
  List<String> listStr = new ArrayList<>();
  List<Student> listStu = new ArrayList<>();
  listStr.forEach(studentStr -> {
   listStu.add(JSON.parseObject(studentStr, Student.class));

  });

  //List根据某个字段过滤、排序
  listStu.stream()
    .filter(student -> student.getSex().equals("女"))
    .sorted(Comparator.comparing(Student::getName))
    .collect(Collectors.toList());

  //List根据某个字段分组
  Map<String,List<Student>> sexGroupMap = listStu.stream()
              .collect(Collectors.groupingBy(Student::getSex));
  //如果Map中多个名称相同,则studentId用逗号间隔
  Map<String,String> studentNameIdMap = listStu.stream()
              .collect(toMap(Student::getName,Student::getStuId,(s,a)->s+","+a));
 }

 public static List<Student> createStudentList() {
  List<Student> list = new ArrayList<Student>();
  Student lily = new Student();
  lily.setStuId("1");
  lily.setName("lily");
  lily.setAge("14");
  lily.setSex("女");
  Student xiaoming = new Student();
  xiaoming.setStuId("2");
  xiaoming.setName("xiaoming");
  xiaoming.setAge("15");
  xiaoming.setSex("男");
  list.add(lily);
  list.add(xiaoming);
  return list;
 }

 public static Map<Object, Object> getStudentObjectMap(List<Student> list) {
  Map<Object, Object> map = list.stream().collect(Collectors.toMap(Student::getStuId, student -> student));
  map.forEach((key, value) -> {
   System.out.println("key:" + key + ",value:" + value);
  });
  return map;
 }

 public static Map<String, String> getStudentNameMap(List<Student> list) {
  Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getStuId, Student::getName));
  map.forEach((key, value) -> {
   System.out.println("key:" + key + ",value:" + value);
  });
  return map;
 }

 public static List<String> getStudentNameList(List<Student> list) {
  List<String> result = list.stream().map(student -> student.getName()).collect(Collectors.toList());
  for (String name : result) {
   System.out.println("name:" + name);
  }
  return result;
 }
}

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

(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

  • JDK8通过Stream 对List,Map操作和互转的实现

    1.Map数据转换为自定义对象的List,例如把map的key,value分别对应Person对象两个属性: List<Person> list = map.entrySet().stream().sorted(Comparator.comparing(e -> e.getKey())) .map(e -> new Person(e.getKey(), e.getValue())).collect(Collectors.toList()); List<Person> l

  • 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 =

  • 在Java 8中将List转换为Map对象方法

    假设有一个员工对象: <b>public</b> <b>class</b> Employee { <font><i>// member variables</i></font><font> <b>private</b> <b>int</b> empId; <b>private</b> String empName; <b&

  • 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

  • 详细介绍Python中的set集合

    目录 Python中的set集合 一.集合是什么? 二.set集合怎么用? 1.创建set集合 2.删除set集合 3.访问set集合元素 4.删除集合中的元素 5.向集合中添加元素 三.set集合的交并补 1.交集 2.并集 3.差集 四.set中的其他方法 五.frozenset 集合 Python中的set集合 一.集合是什么? 集合是什么呢?相信读者朋友们哪怕是没有用过集合这个数据类型.也一定在数学课堂上听过集合这个名词.数学中的集合是一个基本概念,说白了一堆不重复的数字可以组成一个集合

  • Java8使用stream实现list中对象属性的合并(去重并求和)

    前言 需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为BillsNums,有id.nums.sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份. 例如说:("s1", 1, 1),("s1",2,3),("s2",4,4), 求和并去重的话,就是("s1", 3, 4),("s2",4,4) 对象与属性 class BillsNums { private

  • java8如何根据list对象中的属性过滤筛选

    目录 根据list对象中的属性过滤筛选 根据性别筛选出所有的女同学 list根据对象某个字段或多个字段去重.筛选.List转Map.排序.分组.统计计数等 简单示例如下 过滤筛选 分组 去重 List 转 Map 排序 统计计数 根据list对象中的属性过滤筛选 代码演示: 根据性别筛选出所有的女同学 @Data class Student{ public Integer age; public String name; public String sex; } List<Student> s

  • Java8 使用 stream().sorted()对List集合进行排序的操作

    1.声明一个测试对象 import java.time.LocalDate; import java.util.List; import lombok.Data; @Data public class StudentInfo{ //名称 private String name; //性别 true男 false女 private Boolean gender; //年龄 private Integer age; //身高 private Double height; //出生日期 private

  • Java中Json字符串直接转换为对象的方法(包括多层List集合)

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonStr

  • 6种方法初始化JAVA中的list集合

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List<String> languages = new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println

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

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

  • Java8排序stream.sorted()的使用

    在这个页面上我们将提供java 8 Stream sorted()示例.我们可以按照自然排序以及Comparator提供的排序对流进行排序.在java 8中Comparator可以使用lambda表达式进行实例化.我们还可以反转自然排序以及提供的排序Comparator.自然排序使用提供的顺序Comparable,必须由其实例是流元素的类实现.在这个页面上我们将排序List,Map并Set使用java 8流sorted()方法. 1.sorted()方法的语法示例. 1.1sorted():它使

  • Java8利用Stream实现列表去重的方法详解

    目录 一. Stream 的distinct()方法 1.1 对于 String 列表的去重 1.2 对于实体类列表的去重 二. 根据 List<Object> 中 Object 某个属性去重 2.1 新建一个列表出来 2.2 通过 filter() 方法 一. Stream 的distinct()方法 distinct()是Java 8 中 Stream 提供的方法,返回的是由该流中不同元素组成的流.distinct()使用 hashCode() 和 eqauls() 方法来获取不同的元素.

随机推荐