Stream 的终止操作

 一、规约

 * reduce(T iden, BinaryOperator b)     可以将流中元素反复结合起来,得到一个值。 返回 T
* reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。 返回 Optional<T>
public static void test02() {
//01.数值求和
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
/**
*0 是起始x,0 + y[0] 结果赋值给x, 再➕y[1] 结果再赋值给x 再➕y[2] 。。。。。。
* 因为有起始数值,所以不可能为空,所以返回值为 泛型的类型
*/ Integer reduce = list.stream().reduce(0, (x, y) -> x + y);
System.out.println(reduce); System.out.println("--------------------"); //02.求JavaBean的工资属性求和
//没有起始值,可能为空,所以返回值类型设为了Optional,为了避免空指针异常,有可能为空的情况就用这个
Optional<Double> reduce2 = emps.stream()
.map(Employee::getSalary)
.reduce(Double::sum);
System.out.println(reduce2.get()); }

二、收集

方法

描述

collect(Collector c)

将流转换为其他形式。接收一个 Collector接口的 实现,用于给Stream中元素做汇总的方法

Collector 接口中方法的实现决定了如何对流执行收集操作(如收 集到 List、Set、Map)。但是 Collectors 实用类提供了很多静态 方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

/**
* 收集
*/
public static void collect() {
List<String> list = emps.stream()
.map(Employee::getName)
.collect(Collectors.toList());//Collectors.toSet();
list.forEach(System.out::println); System.out.println("----------------------"); TreeSet<String> treeSet = emps.stream()
.map(Employee::getName)
.collect(Collectors.toCollection(TreeSet::new)); //定制化容器类 treeSet.forEach(System.out::println);
}

 三、判断性终止函数

public static void test01() {
boolean allMatch = emps.stream().allMatch(x -> x.getStatus().equals(Status.BUSY));
boolean anyMatch = emps.stream().anyMatch(x -> x.getStatus().equals(Status.BUSY));
boolean noneMatch = emps.stream().noneMatch(x -> x.getStatus().equals(Status.BUSY));
//Optional是一个新的集合类,为了防止空指针异常
Optional<Employee> first = emps.stream().sorted((x1,x2) -> Double.compare(x1.getSalary(),x2.getSalary())).findFirst();
Employee employee = first.get(); //并行执行 sorted和findAny
Optional<Employee> anyEmployeeOptional = emps.parallelStream().sorted((x1,x2) -> Double.compare(x1.getSalary(),x2.getSalary())).findAny();
Employee anyEmployee = first.get(); long count = emps.stream().count(); Optional<Employee> max = emps.stream().max((x, y) -> Double.compare(x.getSalary(), y.getSalary()));
Employee maxSalaryEmployee = max.get(); Optional<Double> minSalary = emps.stream().map(Employee::getSalary)
.min(Double::compare);
Double maxSalary = minSalary.get(); System.out.println(allMatch);
System.out.println(anyMatch);
System.out.println(noneMatch);
System.out.println(anyEmployee);
System.out.println(first);
System.out.println(count);
System.out.println(maxSalaryEmployee);
System.out.println(minSalary);
}
 
 四、组函数
  /**
* 组函数
*/
public static void groupFunction() { //总数
long count0 = emps.stream().count();
Long count1 = emps.stream().collect(Collectors.counting()); System.out.println("总数1:" + count0);
System.out.println("总数2:" + count1); //平均值
Double avg = emps.stream().collect(Collectors.averagingDouble(Employee::getSalary));
System.out.println("平均值:" + avg); //总和
Double collectSum = emps.stream().collect(Collectors.summingDouble(Employee::getSalary));
double reduceSum = emps.stream().mapToDouble(Employee::getSalary).reduce(0, (x, y) -> x + y);
System.out.println("总和1:" + collectSum);
System.out.println("总和2:" + reduceSum); //最大值
Optional<Double> collectMax = emps.stream().map(Employee::getSalary).collect(Collectors.maxBy((x1, x2) -> x1.compareTo(x2)));
Optional<Double> max = emps.stream().map(Employee::getSalary).max((x1, x2) -> x1.compareTo(x2)); System.out.println("最大值1:" + collectMax.get());
System.out.println("最大值2:" + max.get()); //最小值
Optional<Double> collectMin = emps.stream().map(Employee::getSalary).collect(Collectors.minBy((x1, x2) -> x1.compareTo(x2)));
Optional<Double> min = emps.stream().map(Employee::getSalary).min((x1, x2) -> x1.compareTo(x2)); System.out.println("最小值1:" + collectMin.get());
System.out.println("最小值2:" + min.get());
}
 五、分组
    /**
* 分组
*/
public static void group() {
System.out.println("按照单个字段分组-----------------");
Map<Status, List<Employee>> collectGroupMap = emps.stream().collect(Collectors.groupingBy(Employee::getStatus));
collectGroupMap.forEach((key,value) -> System.out.println(key + " | " + value)); System.out.println("\n先按单个字段分组,每个分组里面再按自定义规则分组-----------------"); Map<Status, Map<String, List<Employee>>> innerGroupMapByIdentify = emps.stream().collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy(x -> {
if (((Employee) x).getAge() < 35) {
return "青年";
} else if (((Employee) x).getAge() < 55) {
return "中年";
} else {
return "老年";
}
})));
innerGroupMapByIdentify.forEach((key,value) -> System.out.println(key + " | " + value)); System.out.println("\n先按单个字段分组,每个分组里面再按另外一字段分组-----------------");
Map<Status, Map<String, List<Employee>>> innerGroupMapByColum = emps.stream()
.collect(Collectors.groupingBy(Employee::getStatus,
Collectors.groupingBy(Employee::getName)
)
); innerGroupMapByColum.forEach((key,value) -> System.out.println(key + " | " + value)); System.out.println("\n先按2个字段一起分组-----------------");
Map<String, List<Employee>> columsMap = emps.stream()
.collect(Collectors.groupingBy(x -> ((Employee) x).getName() + " : " + ((Employee) x).getStatus().toString()));
columsMap.forEach((key,value) -> System.out.println(key + " | " + value));
}

六、分区
    /**
* 分区
*/
public static void partition() {
//一层分区
Map<Boolean, List<Employee>> partitionMap = emps.stream().collect(Collectors.partitioningBy(x -> x.getAge() > 35));
//多层级分区,二层按照一层相同的规则分区
Map<Boolean, Map<Boolean, List<Employee>>> collect = emps.stream().collect(Collectors.partitioningBy(x -> x.getAge() > 35, Collectors.partitioningBy(x -> x.getSalary() < 6000.0))); //多层级分区,二层按照一层不同的规则分区
Map<Boolean, Map<String, List<Employee>>> collect1 = emps.stream().collect(Collectors.partitioningBy(x -> x.getAge() > 35, Collectors.groupingBy(Employee::getName))); partitionMap.forEach((key,value) -> System.out.println(key + " | " + value));
collect.forEach((key,value) -> System.out.println(key + " | " + value));
collect1.forEach((key,value) -> System.out.println(key + " | " + value));
}
七、字符串拼接:join 

/**
* 字符串拼接:join
*/
public static void join(){
String joinResult = emps.stream().map(Employee::getName).collect(Collectors.joining(",", " ===start=== ", " ===end=== "));
System.out.println(joinResult);
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Reduce:规约;Collector:收集、判断性终止函数、组函数、分组、分区的更多相关文章

  1. MySQL-第九篇分组和组函数

    1.组函数 组函数:即多行函数,组函数将一组记录作为整体计算,每组记录返回一个结果,而不是每条记录返回一个结果. 2.常用的组函数有: 1>avg([distinct|all]expr):计算多 ...

  2. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  3. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  4. Firefox 对条件判断语句块内的函数声明的处理与其他浏览器有差异

    标准参考 函数声明和函数表达式 定义一个函数有两种途径:函数声明和函数表达式. 函数声明: function Identifier ( FormalParameterList opt ) { Func ...

  5. sqlserver判断是否为数字的函数

    ISNUMERIC 确定表达式是否为一个有效的数字类型. 语法  ISNUMERIC ( expression ) 参数 expression 要计算的表达式. 返回类型 int 测试: select ...

  6. (查找函数+atoi)判断与(注册函数+strcmp函数)判断两种方法

    loadrunner中接口判断的2中方法    如下: 1. ●查找函数web_reg_find() ● atoi():将字符串转换为整型值 作比较  > 0 Action() { //检查点函 ...

  7. Python_代码练习_写一个判断是否为小数的函数

    这两天在学习函数,练习写一个判断是否为小数的函数,看起来蛮简单的,飞速写完很是得意,然后测了一下,发现差得好多呀,这个并不像想象那样简单,我得到的教训是,想要把一个需求哪怕再小的需求考虑周全,都不是件 ...

  8. 【Linux编程】进程终止和exit函数

    内核要运行一个应用程序,唯一的途径是通过系统调用.exec函数.exec又会调用启动程序,启动程序(一般是汇编语言)以类似以下的方式调用main函数: void exit(main(argc, arg ...

  9. Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数

    高阶函数Higher-orderfunction 变量可以指向函数 >>> abs #abs(-10)是函数调用,而abs是函数本身 <built-in function ab ...

随机推荐

  1. Mybatis中org.apache.ibatis.binding.BindingException错误问题总结

    1. Mybatis出现多个参数,但是多个参数中没有使用@Param注解进行修饰 2. Xml文件中字段名和PO绑定时候,字段写错了 3.XML中<foreach/>标签中的colleac ...

  2. JDK8中的并行流

    1.IntStream.parallel():获取并行流处理 2. Collection中调用parallelStream()获取并行流 3.并行排序Arrays.parallelSort()

  3. CodeFroces-- Feel Good

    题目大意:给出一段无序数组找出任意 一段区间和*这段区间的最小值 使这个值最大 栈的经典问题 用栈预处理出当前ai 为这块区间最小值的时候 的区间范围(L 和R) #include<bits/s ...

  4. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  5. java实现sftp客户端上传文件以及文件夹的功能

    1.依赖的jar文件 jsch-0.1.53.jar 2.登录方式有密码登录,和密匙登录 代码: 主函数: import java.util.Properties; import com.cloudp ...

  6. A1131. Subway Map (30)

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  7. JavaScript FormData的详细介绍及使用

    本文转自:https://blog.csdn.net/liupeifeng3514/article/details/78988001 FormData的详细介绍及使用请点击此处,那里对FormData ...

  8. Vuex速学篇:(2)利用state保存新闻数据

    回顾 以前我们在做这个新闻列表的时候,是一个写死的数据 export default{ data(){ return{ newslist:[ {newsid:"101",pubti ...

  9. maomao的现在与未来

    今晚开始,maomao决定要成为一个和以前不一样的人了. 自从高一开始竞赛生涯以来,我的竞赛就一直处于不是很好,也不是很差的水平,就像我初中一年级到二年级一直处于的状态一样.一直以来,我从来没有对自己 ...

  10. Python编程快速上手-让繁琐工作自动化-第二章习题及其答案

    Python编程快速上手-让繁琐工作自动化-第二章习题及其答案 1.布尔数据类型的两个值是什么?如何拼写? 答:True和False,使用大写的T和大写的F,其他字母是小写. 2.3个布尔操作符是什么 ...