中间操作:filter()、distinct()、sorted()、map()、flatMap()等,一般是对数据集的整理(过滤、排序、匹配、抽取等),将一个stream转换成另一个stream。
终止方法:往往是完成对数据集中数据的处理,如forEach(),还有allMatch()、anyMatch()、findAny()、 findFirst(),数值计算类的方法有sum、max、min、average等等。终止方法也可以是对集合的处理,如reduce()、 collect()等等。reduce()方法的处理方式一般是每次都产生新的数据集,而collect()方法是在原数据集的基础上进行更新,过程中不产生新的数据集。
public class user{
String userId;
String userName;
int age;
int sex; //male 1 female 2
}
List<User> userList = new ArrayList<User>();
获得所有用户中年龄最大或最小的
Optional<User> maxAgeUser = userList.stream().max(Comparator.comparingInt(User::getAge));
Optional<User> minAgeUser = userList.stream().min(Comparator.comparingInt(User::getAge));
获得所有用户年龄平均值
Double ageAvg = list.stream().collect(Collectors.averagingInt(User::getAge));
获得所有用户年龄总和
//利用IntSummaryStatistic也可以计算最大值最小值平均值这些
IntSummaryStatistics summaryStatistics = list.stream().collect(Collectors.summarizingInt(User::getAge));
int sum = summaryStatistics.getSum();
//利用summingInt
int sum = list.stream().collect(Collectors.summingInt(User::getAge));
//利用mapToInt
int sum = list.stream().mapToInt(a -> a.getAge()).sum();
//利用reduce
int sum = list.stream().map(User::getAge).reduce((a,b)->a+b);
将所有用户用户名拼接字符串并逗号分隔
//利用joining
String usersName = list.stream().map(User::getAge).collect(Collectors.joining(", "));
//利用reduce
String usersName = list.stream().map(User::getUserName).reduce((a,b)->a+","+b);
按性别分类后的统计
//按性别统计人数
Map<Integer, Integer> mapBySexCount = list.stream().collect(Collectors.groupingBy(User::getSex,Collectors.summingInt(p -> 1)));
//按性别统计18岁以上人群的年龄平均值
Map<Integer, Double> mapBySexAgeAvg = list.stream().filter(a->a.getAge() > 18).collect(Collectors.groupingBy(User::getSex,Collectors.averagingInt(User::getAge)));
//按性别获取所有用户的名称字符串逗号分隔
Map<Integer, String> mapBySexNames= list.stream().collect(Collectors.groupingBy(User::getSex,Collectors.reducing("",User::getUserName,(a,b)->a+","+b)));
//按性别分组后按年龄倒序
Map<Integer, List<User>> mapBySexSortByAge = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.groupingBy(User::getSex,Collectors.toList()));
关于常见参数的理解:
- U identity 可以理解为一个聚合操作的初始值,比如聚合目标为一个字符串,则identity可为“姓名:”,姓名:张三,李四,周五。
- BinaryOperator op 函数式接口,可以指定一段lambda表达式,或者方法的引用。
- java.util.function.Function<? super T, ? extends U> mapper 一个方法的引用,该方法作为返回某个属性值的映射。
- java.util.stream.Collector<? super T, A, R> collector 一个收集器,例如Collectors.groupingBy()。