Java Stream操作--常用方法

2023-10-27


什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。
  • parallelStream() − 为集合创建并行流。
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
List<String> filtered = strings.stream().filter(string -> 
!string.isEmpty()).collect(Collectors.toList());

forEach

Stream 提供了新的方法 forEach 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

map

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct()
	.collect(Collectors.toList());

filter

filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 
long count = strings.stream().filter(string -> string.isEmpty()).count();

limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random(); 
random.ints().limit(10).sorted().forEach(System.out::println);

并行(parallel)程序

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
// 获取空字符串的数量 
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

我们可以很容易的在顺序运行和并行直接切换。


Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); 
System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); 
System.out.println("合并字符串: " + mergedString);

统计

另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); 
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Stream操作--常用方法 的相关文章

  • 切换大小写错误。用于 Mac 上 Android 开发的 Eclipse IDE:将工作区合规性更改为 JRE 1.7

    当尝试在 android 项目中使用带有 switch string 的 Switch Case 时 我在 eclipse IDE 中收到错误消息 将工作区合规性更改为 JRE1 7 对于低于 1 7 的源级别 无法打开字符串类型的值 仅允
  • java中可以有switch(java.lang.Object)吗?

    我的应用程序需要有类型的 switch case 语句String 我需要这样的东西 Object list1 list1 Object list2 list2 Object list3 list3 Object option list1
  • Webdriver 和 Chrome:DevToolsActivePort 文件不存在

    我正在尝试安装 配置 Selenium 以在队友不在办公室时进行一些 UI 测试 我已经安装了 Selenium Webdriver 和 Eclipse 以及 Chrome Firefox 和 Edge 浏览器驱动程序 我有一些非常简单的脚
  • Mockito - 监视真实对象调用原始方法

    想象一下下面的代码 List list List spy spy list doThrow new NullpointerException when spy get 0 doThrow 执行list get 0 这根本没有意义 我想定义模
  • Spring:url 无法正确解析链接

    尽管我对 Java 有丰富的经验 但我对 Spring 框架和 Web 应用程序还很陌生 当我在本地 tomcat 服务器上运行我的网站时 URL 为 http localhost 8080 myApp 现在 请求映射将我委托到我的主页 R
  • 同步 Set 线程的构造函数副本安全吗?

    获取同步版本的最简单方法java util Set将使用Collections synchronizedSet 像这样 Set mySyncSet Collections synchronizedSet new HashSet The Ja
  • Java 可以启动 Windows UAC 吗?

    正如标题所说 我想知道用 Java 编写的程序是否可能 并且只有java 以管理员权限重新启动自己 最好是 jar 以本机 Windows UAC 的方式显示 为了使其对用户更可信 我做了功课 发现可以使用来完成此操作C 和 Java 之间
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • 如何从 Android 服务获取应用程序上下文?

    我有一个正在运行并监听麦克风输入的 Android 服务 我希望它在满足特定条件时启动一项活动 为了创建意图 我需要应用程序上下文 我怎么才能得到它 Intent i new Intent ctx SONR class i addFlags
  • AWS AppSync 授权

    我计划使用 AWS Appsync 迁移 lambda 函数中的 graphQL 终端节点 该函数由 API 网关的 POST 触发 我研究 AppSync 主要是因为订阅 我无法使用 Lambda 函数创建订阅 我的身份验证机制基于 Au
  • 我应该在哪里以 Java MVC 模式调用我的 swingworker

    我有一个程序 其设置基本上与此 MVC 示例中的程序一样 http www leepoint net notes java GUI struct 40mvc html http www leepoint net notes java GUI
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • Rmi 错误 IllegalArgumentException、MarshalException

    为所有人上课 package Task2 import java rmi RemoteException import java rmi server UnicastRemoteObject public class IdCl extend
  • 为数组生成随机索引

    我知道对于普通整数来说这是这样 但是有索引这样的东西吗 Random dice new Random int n dice nextInt 6 System out println n 你是什 么意思 数组索引是普通数字 所以你可以轻松地做
  • ACTION_MEDIA_BUTTON 的广播接收器不起作用

    我正在为 Android 操作系统版本 4 0 3 ICS 编写 Android 应用程序 问题是我没有从 BroadcastReceiver 的 onReceive 方法中的 Log d 获得输出 这意味着我的应用程序没有正确处理广播 我
  • 正确检查 FTP 服务器连接

    我在程序开始时打开与 FTP 服务器的连接 在对服务器执行操作之前 我想检查连接是否已成功建立 最简单快速的方式 因此如果连接消失 我将尝试再次连接 我用这段代码来做到这一点 private boolean checkConnection
  • 为什么 pagefactory 类在从另一个类初始化时返回 null

    在我的测试课上 我有DesiredCapabilities为 Appium 测试设置 在该课程中 我初始化了 BasePage 课程pagefactory元素 当我运行测试时 它按预期工作 现在 我尝试将 DesiredCapability
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只
  • Spring Boot 应用程序崩溃

    请告诉我哪里有问题 我尝试启动我的第一个在 Spring Boot 上开发的应用程序 我已经在 SpringMVC 上有了简单的 Web 项目 现在我喜欢在 BOOT 上构建它 这是错误输出 org springframework bean

随机推荐

  • GoLang之使用uber-go/dig进行依赖注入

    文章目录 GoLang之使用uber go dig斤进行依赖注入 1 依赖输注入介绍 2 main函数反面例子 3 下载DI依赖 4 main函数使用DI优化 5 注意点 GoLang之使用uber go dig斤进行依赖注入 注 本文是基
  • AtomicInteger、Unsafe类、ABA问题

    AtomicInteger Java中的AtomicInteger大家应该很熟悉 它是为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类 AtomicInteger内部有一个变量UnS
  • Linux 中的 chroot 命令及示例

    Linux Unix系统中的chroot命令用于更改根目录 Linux Unix 类系统中的每个进程 命令都有一个称为root 目录的当前工作目录 它更改当前正在运行的进程及其子进程的根目录 在此类修改的环境中运行的进程 命令无法访问根目录
  • 巧用redis实现点赞功能,它不比mysql香吗?

    提到点赞 大家一想到的是不是就是朋友圈的点赞呀 其实点赞对我们来说并不陌生 我们经常会在手机软件或者网页中看到它 今天就让我们来了解一下它的实现吧 我们常见的设计思路大概分为两种 一种自然是用MySQL等数据库直接落地存储 另外一种就是将点
  • 常见linux服务器存储空间,怎么在linux上查看服务器的存储空间多大

    1 Linux下可以在 proc cpuinfo中看到每个cpu的详细信息 但是对于双核的cpu 在cpuinfo中会看到两个cpu 常常会让人误以为是两个单核的cpu 其实应该通过Physical Processor ID来区分单核和双核
  • 【linux系统编程】基础开发工具:vi/vim

    Linux文本编辑器 vim 正文开始 Assassin 目录 Linux文本编辑器 vim 1 vim基本介绍 2 vim下各模式的切换 3 vim命令模式 4 vim底行模式 5 vim可视化模式 6 额外补充 6 1 非法退出 6 2
  • 解密SVM系列(二):SVM的理论基础

    上节我们探讨了关于拉格朗日乘子和KKT条件 这为后面SVM求解奠定基础 本节希望通俗的细说一下原理部分 一个简单的二分类问题如下图 我们希望找到一个决策面使得两类分开 这个决策面一般表示就是 WTX b 0 W TX b 0 现在的问题是找
  • 如何进阶TypeScript功底?一文带你理解TS中各种高级语法

    引言 TypeScript 的重要性我不在强调了 我相信仍然会有大多数前端开发者碰到复杂类型一概使用 any 处理 我写这篇文章的目的就是为了让你告别 AnyScript 文章告别晦涩的概念结合实例来为你讲述一系列 TS 高级用法 分发 循
  • ipad横屏怎么设置方法,如何使ipad横屏

    ipad怎么设置横屏竖屏 具体如下 1 首先打开我们的平板 之后在屏幕上由下往上滑 如图 请点击输入图片描述请点击输入图片描述2 之后会出现一个菜单设置界面 点击选项右侧的 圆形 按钮 就可以锁定当前屏幕的方向 我们再点击一下就可以取消锁定
  • Golang协程,通道详解

    进程 线程以及并行 并发 关于进程和线程 进程 Process 就是程序在操作系统中的一次执行过程 是系统进行资源分配和调度的基本单位 进程是一个动态概念 是程序在执行过程中分配和管理资源的基本单位 每一个进程都有一个自己的地址空间 一个进
  • ChatGPT Sorry, you have been blocked(抱歉,您已被屏蔽)的解决方法

    最近在使用 ChatGPT 时大家遇到的最多的问题就是 Sorry you have been blocked 抱歉 您已被屏蔽 了 之前的 Access denied 似乎都不常见了 今天老王就分享下这个问题的原因和解决方法 一 Chat
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近5年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • java 微信提现(复制即用)

    微信的支付是麻烦 但支付很简单 直接上代码 有详细注释 一共四个文件 重点 调用微信提现 import back minsu configure Token import back minsu param TiXianParam impor
  • 局部变量作为返回值

    一般来说 函数是可以返回局部变量的 局部变量的作用域只在函数内部 在函数返回后 局部变量的内存已经释放了 因此 如果函数返回的是局部变量的值 不涉及地址 程序不会出错 但是如果返回的是局部变量的地址 指针 的话 程序运行后会出错 因为函数只
  • NIO 简单封装

    对NIO进行封装 使其方便使用 UML类图 DatagramChannel 打开一个指定端口或随机端口 并可以接收任何发到本端口的数据报 也可以发送数据报到任何一个远程的地址 一个 DatagramChannel 即可以做为Server端
  • Jmeter(三十二) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy5(详解教程)

    1 简介 这一篇文章 主要想讲解一下 录制完脚本不是就完事了 我们有时候还需要断言 看结果是否和我们预期的结果一致 这在测试中都是很重要的 用句老话说 只看结果不看过程 2 录制脚本 想要断言 我们就必须的有脚本 才能断言 没有脚本我们就无
  • 警告 Invalid cookie header: "Set-Cookie:

    1 根据网上的办法设置cookie if httpGet getFirstHeader Set Cookie null String cookie httpGet getFirstHeader Set Cookie getValue htt
  • Linux安全之SSH 密钥创建及密钥登录

    在我们平时使用Linux系统时候 通常使用的Linux SSH登录方式是用户名加密码的登录方式 今天来探讨另外的一种相对安全的登录方式 密钥登录 我们知道SSH登录是用的RSA非对称加密的 所以我们在SSH登录的时候就可以使用RSA密钥登录
  • 成员内部类

    heartbeat this hearbeat People this heartbeat
  • Java Stream操作--常用方法

    什么是 Stream Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而是按需计算 数据源 流的来源 可以是集合 数组 I O channel 产生器g