1.方法介绍:
Collectors接口中方法的实现决定了如何对流执行收集操作(如搜集到List、Set、Map)。
toList:把流中元素收集到List
toSet:把流中元素收集到Set
toCollection:把流中元素收集到创建的集合
counting:计算流中元素的个数
summingInt:对流中元素的整数属性求和
averagingInt:计算流中元素Integer属性的平均值
summarizingInt:收集流中Integer属性的统计值
joining:连接流中的每个字符串
maxBy:根据比较器选择最大值
minBy:根据比较器选择最小值
reducing:从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而规约成单个值
collectingAndThen:包裹另一个收集器,对其结果转换函数
groupingBy:根据某个属性值对流分组,属性为K,结果为V
partitioningBy:根据true、false进行分区
2.具体使用
package com.zyp.test;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import jdk.internal.dynalink.linker.LinkerServices;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
public class StreamPlus {
public static void main(String[] args) {
Person p1=new Person(1, "1", "男", 18,"一年级");
Person p2=new Person(2, "2", "女", 17,"二年级");
Person p3=new Person(3, "3", "男", 18,"三年级");
Person p4=new Person(4, "2", "女", 19,"二年级");
Person p5=new Person(5, "1", "男", 20,"一年级");
Person p6=new Person(6, "3", "男", 18,"三年级");
List<Person> lists= Lists.newArrayList(p1,p2,p3,p4,p5,p6);
//遍历输出
lists.stream().forEach(p-> System.out.println(p));
System.out.println("------------------------------");
//根据年龄排序,默认升序,reversed()逆序输出
lists.stream().sorted(Comparator.comparing(Person::getAge,Integer::compareTo).reversed()).forEach(s-> System.out.println(s));
System.out.println("------------------------------");
//输出性别为女并且年龄大于18
lists.stream().filter(person -> StringUtils.equals(person.getSex(),"女") && person.getAge()>18).forEach(p-> System.out.println(p));
System.out.println("------------------------------");
//分别输出年龄大于18和小于等于18的年龄总和
lists.stream().collect(Collectors.partitioningBy(p->p.getAge()>18,Collectors.summingInt(Person::getAge))).forEach((K,V)->{
System.out.println((K?"大于18":"小于等于18")+"的年龄总和"+V);
});
System.out.println("------------------------------");
//根据性别分组
lists.stream().collect(Collectors.groupingBy(Person::getSex)).forEach((K,V)->{
System.out.println(K+"的有"+V);
});
//根据性别和年级分组
System.out.println("------------------------------");
lists.stream().collect(Collectors.groupingBy(person -> person.getClass1()+"年级"+person.getSex())).
forEach((K,V)->System.out.println(K+"的有"+V));
//统计男女总数
System.out.println("------------------------------");
lists.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.counting())).forEach((K,V)->{
System.out.println(K+"有"+V+"个");
});
//统计男女年龄
System.out.println("------------------------------");
//对流中元素的整数属性求和
//方式1
lists.stream().collect(Collectors.groupingBy(Person::getSex,Collectors.summingInt(Person::getAge))).forEach((K,V)->{
System.out.println(K+"总年龄为"+V);
});
//收集流中Integer属性的统计值
//方式2
System.out.println("------------------------------");
lists.stream().collect(Collectors.groupingBy(Person::getSex,Collectors.summarizingInt(Person::getAge))).forEach((K,V)->{
System.out.println(K+"总年龄为"+V.getSum());
});
//统计每个年级男女的年龄的和
System.out.println("------------------------------");
lists.stream().collect(
Collectors.groupingBy(person -> person.getClass1()+person.getSex()+"的",
Collectors.summingInt(Person::getAge))).forEach((K,V)->
System.out.println(K+"总年龄为"+V)
);
System.out.println("------------------------------");
//获取每个年级年龄最大的人
lists.stream().collect(Collectors.groupingBy(Person::getClass1,
Collectors.maxBy(Comparator.comparing(Person::getAge)))).forEach((K,V)->{
System.out.println(K+"最大年龄为"+V.get().getAge());
});
System.out.println("------------------------------");
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
class Person{
@ApiModelProperty("序号")
private Integer id;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("性别")
private String sex;
@ApiModelProperty("年龄")
private Integer age;
@ApiModelProperty("班级")
private String class1;
}