Stream流使⽤groupingBy+mapping实现对分组之后的对象集
合转化为对象的。。。
JAVA8实战对此的介绍⽚段:
Java8的Stream为我们提供了⽅便的分组收集器groupingBy,利⽤这个收集器我们可以很⽅便的根据某个对象集合的每个元素的某个属性的值来进⾏分组。普通⽤法进⾏分组之后,会将整个对象集合分成我们选定的属性的值的数量个组别。也即是说,如果我们选定的是对象集合AList中每个元素对象的属性A进⾏分组,A⼀共存在1,2,3三个值,那么,最终AList就会被分成三个组,每个组内的元素集合分别对应属性A的值为1,2,3的集合。
说起来可能有点绕,例如:
有个person类:
public class Person {
/**
* 名字
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 年龄
*/
private Integer age;
@Override
public String toString() {
return String.format("【name:%s,sex:%s,age:%d】", name, sex, age);    }
public Person(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
然后新建测试类:
import java.util.stream.Collectors;
public class testMain {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
// 四个参与测试的⼩伙伴
Person tom = new Person("tom", "男", 11);
Person amy = new Person("amy", "⼥", 13);
Person ali = new Person("ali", "男", 12);
Person daming = new Person("daming", "男", 13);
personList.add(tom);
personList.add(amy);
personList.add(ali);
personList.add(daming);
// 对⼩伙伴按照性别age进⾏分组
Map<String, List<Person>> resultMap = personList.stream().upingBy(Person::getSex));
System.out.String());
}
}
运⾏结果:
这时我们得到的是⼀个map,map的key就是我们选定的⽤来进⾏分组的属性sex出现的所有的值,value就是由PersonList集合中的sex属性值与当前key相等的所有元素组成的List集合(集合元素对象是person类型)。
很好,接下来,我们希望依然根据性别分组,并且得到每个分组中的所有⼩伙伴的名字即可,⽽不是全部信息。
这时候,就需要⽤到groupingBy的第⼆个参数,这个参数可以接受所有类型的收集器,这⾥,我们使⽤mapping收集器来满⾜我们的需求,mapping收集器跟stream中间操作中的map基本上功能⼀致。
mapping收集器接收两个参数:
第⼀个参数是lambda表达式,⽤来进⾏属性转换。
第⼆个参数是⼀个收集器,⽤来收集汇总第⼀个参数的lambda表达式的结果。
让我们修改测试类,使得最终得到的分组结果中,只包含⼩伙伴的名称,⽽不是⼩伙伴的全部信息。
1.⾸先我们需要修改分组stream的接收结果数据的类型,由Map<String, List<Person>>改为Map<String, Set<String>>,之所以改⽤Set是为了去重⼩伙伴的名字。
2.为groupingBy添加第⼆个参数,⼀个mapping收集器,这个mapping收集器的第⼀个参数为⽅法引⽤Person::getName,以此获取⼩伙伴的姓名,第⼆个参数为Set(),以此来把第⼀个参数的Person::getName所得到的每⼀个⼩伙伴的姓名组装到⼀个Set集合中。
修改后的测试类代码如下:
import java.util.Set;
import java.util.stream.Collectors;
public class testMain {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
// 四个参与测试的⼩伙伴
java stream
Person tom = new Person("tom", "男", 11);
Person amy = new Person("amy", "⼥", 13);
Person ali = new Person("ali", "男", 12);
Person daming = new Person("daming", "男", 13);
personList.add(tom);
personList.add(amy);
personList.add(ali);
personList.add(daming);
// 对⼩伙伴按照性别age进⾏分组
Map<String, Set<String>> resultMap = personList.stream().upingBy(Person::getSex, Collectors.mapping(Person::getName, Collectors.t        System.out.String());
}
}
运⾏结果如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。