简介:
遇到这么一个业务,举例说明把List<Person>中,idCard是重复的,我需要把相同idCard取出来,放进一个新的List里面,传给前端<<String,List<对象>>>,其中k为idCard,v为重复的Person
利用 : 就可以实现 Map<String, List<Person>> map = totalList.stream()
.collect(Collectors.groupingBy(Person::getIdCard));
完整测试用例:
package Lx; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class StreamLiu { public static void main(String[] args) { List<String> list12 = new ArrayList<>(); // 假设有三个包含对象的list链表 List<Person> list1 = new ArrayList<>(); Person person = new Person(); person.setIdCard("100001"); //考试id person.setName("张三");//姓名 person.setAge("100分");//分数 list1.add(person); // 向list1中添加一些Person对象 List<Person> list2 = new ArrayList<>(); // 向list2中添加一些Person对象 Person person2 = new Person(); person2.setIdCard("100002"); person2.setName("李四"); person2.setAge("85分"); list2.add(person2); List<Person> list3 = new ArrayList<>(); // 向list3中添加一些Person对象 Person person3 = new Person(); person3.setIdCard("100003"); person3.setName("赵芳"); person3.setAge("12分"); list3.add(person3); List<Person> list4 = new ArrayList<>(); // 向list3中添加一些Person对象 Person person4 = new Person(); person4.setIdCard("100003"); person4.setName("赵芳"); person4.setAge("50分"); list4.add(person4); // 将这三个链表合并成一个总的链表 List<Person> totalList = new ArrayList<>(); totalList.addAll(list1); totalList.addAll(list2); totalList.addAll(list3); totalList.addAll(list4); Map<String, List<Person>> map = totalList.stream() .collect(Collectors.groupingBy(Person::getIdCard)); // 遍历map for (Map.Entry<String, List<Person>> entry : map.entrySet()) { String key = entry.getKey(); List<Person> value = entry.getValue(); System.out.println("Key: " + key); // 遍历List for (Person person1 : value) { System.out.println("Person: " + person1.toString()); } } } } class Person { private String idCard; // 其他属性和方法 private String name; //性别1男2女 private String age; public String getIdCard() { return idCard; } public void setIdCard(String idCard) { this.idCard = idCard; } // 其他getter和setter方法 public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "idCard='" + idCard + '\'' + "name='" + name + '\''+ "age='" + age + '\''+ // 其他属性 '}'; } }
打印:
介绍:
这段代码使用流(Stream)实现了将totalList
列表中的元素按照idCard
字段进行分组,并将结果放入Map<String, List<Person>>
类型的容器map
中。
Map<String, List<Person>> map = totalList.stream() .collect(Collectors.groupingBy(Person::getIdCard));
- 第1行代码使用
totalList.stream()
方法将totalList
列表转换为流(Stream)对象。 - 第2行代码使用流的
collect
方法结合Collectors.groupingBy
收集器实现分组操作。其中groupingBy
方法的参数是一个分类函数(Function),它决定了按照哪个字段进行分组。在这里,使用的是Person::getIdCard
作为分类函数,表示按照idCard
字段进行分组。在Java 8中,可以使用::
符号来直接引用方法,这里的引用方法是getIdCard
,它是Person
类中的一个获取idCard
字段的方法。Collectors.groupingBy
方法的返回值是一个Map<String, List<Person>>
类型,它表示按照idCard
字段分组后的结果。
需要注意的是,示例代码中假设了Person
类有一个名为idCard
的字段,并且该字段的数据类型为String
。你需要根据实际情况更改对应的字段名和数据类型。