当前位置: 首页 > article >正文

Java函数式编程【三】【Stream终止操作】【上】之【简单约简】

函数式编程可分为三个步骤:流的创建、流的中间操作和流的终止操作。其中流的中间操作可以有n个,而流的终止操作只能有一个。

函数式编程三个步骤示意图:
在这里插入图片描述

常用的终止操作

Stream的终止操作大致可分为两大类:简单约简的终止操作和复杂终止操作。

(一)、八个常用的简单约简终止操作

  • allMatch、anyMatch、noneMatch 匹配操作,数据流中是否存在符合条件的元素 返回值为boolean值。
  • count 统计操作,统计最终的数据个数。
  • findFirst、findAny 查找操作,查找第一个、查找任何一个 返回的类型为Optional。
  • min、max 最值操作,需要自定义比较器,返回数据流中最大最小的值。

简单约简的返回结果是要么是boolean,要么是Optional类型。

(二)、复杂的终止操作

  • forEach、forEachOrdered 遍历操作,这两个操作都是对Stream中的数据元素进行消费操作。
  • collect 收集操作,将所有数据收集起来,这个操作非常重要,官方的提供的Collectors 提供了非常多收集器,可以说终止操作collect是Stream的终极大杀器。
  • reduce 归约操作,将整个Stream中的数据元素归约为一个值,例如:count、min、max底层就是使用reduce实现的。
  • toArray 数组操作,将Stream中的数据元素存放到数组中。

终止操作的使用示例

1,匹配操作(allMatch、anyMatch、noneMatch)Stream也支持类似集合匹配元素的操作,匹配返回的结果是boolean类型。
anyMatch(Predicate), allMatch(Predicate), 和 noneMatch(Predicate): 检查流中是否有符合给定条件的元素、是否所有元素都符合条件、是否没有元素符合条件。

List<Integer> list = Arrays.asList(7, 6, 9, 3, 2, 15);
boolean anyMatch = list.stream().anyMatch(x -> x < 6);
boolean allMatch = list.stream().allMatch(x -> x < 6);
boolean noneMatch = list.stream().noneMatch(x -> x < 6);

2,统计操作 count(): 统计流中元素的数量。

	long count = Stream.of("Alice", "Bob", "Charlie").count();

3,计算最大和最小值:max(Comparator) 和 min(Comparator): 根据比较器返回流中的最大或最小元素。

在这里插入图片描述

		Optional<String> maxName = Stream.of("Alice", "Bob", "Charlie").max(Comparator.naturalOrder());
        System.out.println("最长的名字:" + maxName.get());
        List<String> sList = Arrays.asList("World", "me", "you");
		Optional<String> min = sList.stream().min(Comparator.comparing(String::length));
		System.out.println("最短的字符串:" + min.get());
		Optional<String> max = sList.stream().max(Comparator.comparing(String::length));
		System.out.println("最长的字符串:" + max.get());

4,查找操作:(findFirst/findAny)查找第一个、查找任何一个 返回的类型为Optional。

        List<Integer> list = Arrays.asList(7, 6, 9, 3, 2, 15);
        // 匹配第一个
        Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
        // 匹配任意(适用于并行流)
        Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
        System.out.println("匹配第一个值:" + findFirst.get());
        System.out.println("匹配任意一个值:" + findAny.get());  

5,遍历操作( forEach)

终止操作 forEach的方法签名(原型),它的输入参数是一个类型为消费者接口的函数接口:

	void java.util.stream.Stream.forEach(Consumer<? super Integer> action)

下面是一个查找操作和遍历操作的示例:

        List<Integer> list = Arrays.asList(7, 6, 9, 3, 2, 15);
        // 遍历输出符合条件的元素
        list.stream().filter(x -> x > 6).forEach(System.out::println);

参考文献:

  • Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合-CSDN
  • 1.Java Stream 流操作

http://www.kler.cn/a/440946.html

相关文章:

  • 低代码系统-产品架构案例介绍、轻流(九)
  • 【React】PureComponent 和 Component 的区别
  • DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解决方法
  • Spring RESTful API 设计与实现
  • Java开发vscode环境搭建
  • 网站快速收录:利用新闻源的优势
  • 跑步训练(蓝桥杯2020试题A)
  • 微知-python包管理工具pip如何查看安装了某个库?(pip3 show xxx;pip3 list; pip3 show xxx -v)
  • 自动驾驶---小米汽车智驾进展
  • React状态管理常见面试题目(一)
  • Spark执行计划解析后是如何触发执行的?
  • 表格树(有展开功能)数据量大导致渲染慢问题的解决方法
  • 【21天学习AI底层概念】day8 强人工智能会在什么时候实现?
  • [Unity Shader] 【图形渲染】Unity Shader的种类1-深入理解表面着色器(Surface Shader)
  • 设计模式12:状态模式
  • Leetcode经典题14--罗马数字和整数之间的相互转换
  • 【linux】shell(37)-脚本调试
  • Scala-异常
  • 网络安全、Web安全、渗透测试之笔经面经总结(二)
  • 鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现
  • QT TCP(socket)编程-服务器与客户端IP地址问题
  • 在 SQL Server 中获取指定字符所在有位置索引
  • stm32-- 存储-flash和ram
  • Hadoop概述
  • Linux实操篇-远程登录/Vim/开机重启
  • 【超详细实操内容】django的身份验证系统之User对象