Java SE入门及基础(55) Stream流及常用API

目录

第一节 Stream 流

1. 管道

2.如何获取 Stream 流

Collection 接口

Stream 接口

示例

3. Stream 流中间聚合操作

Stream 接口

示例

4. Stream 流终结操作

示例

5. Stream 流聚合操作与迭代器的区别

面试题


第一节 Stream

1. 管道

        管道

A pipeline is a sequence of aggregate operations.
管道就是一系列的聚合操作。
A pipeline contains the following components:
管道包含以下组件:
        A source: This could be a collection, an array, a generator function, or an I/O channel.
        源:可以是集合,数组,生成器函数或I / O 通道。
        Zero or more intermediate operations. An intermediate operation, such as filter, produces a new stream.
        零个或多个中间操作。诸如过滤器之类的中间操作产生新的流。
        A terminal operation. A terminal operation, such as forEach, produces a non-stream result, such as a primitive value (like a double value), a collection, or in the case of forEach, no value at all.
        终结操作。终端操作(例如forEach )会产生非流结果,例如原始值(如双精度值),集合,或者在forEach的情况下根本没有任何值。

         

A stream is a sequence of elements. Unlike a collection, it is not a data structure that stores elements. Instead, a stream carries values from a source through a pipeline.
流是一系列元素。 与集合不同,它不是存储元素的数据结构。 取而代之的是,流通过管道携带来自源的值。
The filter operation returns a new stream that contains elements that match its predicate (this operation's parameter).
筛选器操作返回一个新流,该流包含与筛选条件(此操作的参数)匹配的元素。

2.如何获取 Stream

Collection 接口

default Stream < E > stream ();

Stream 接口

// 获取流
public static < T > Stream < T > of ( T ... values );
// 将两个流拼接形成一个新的流
public static < T > Stream < T > concat ( Stream <? extends T > a , Stream <? extends T > b );

示例

import java . util . Arrays ;
import java . util . HashMap ;
import java . util . List ;
import java . util . Map ;
import java . util . stream . Stream ;
public class StreamTest {
        public static void main ( String [] args ) {
                List < Integer > numbers1 = Arrays . asList ( 1 , 2 , 3 , 4 , 5 );
                Stream < Integer > s1 = numbers1 . stream ();
                Stream < Integer > s2 = Stream . of ( 6 , 7 , 8 , 9 , 10 );
                Stream < Integer > s3 = Stream . concat ( s1 , s2 );
                Map < String , Integer > map = new HashMap <> ();
                map . put ( "a" , 1 );
                map . put ( "b" , 2 );
                Stream < Map . Entry < String , Integer >> s4 = map . entrySet (). stream ();
        }
}

3. Stream 流中间聚合操作

Stream 接口

Stream < T > filter ( Predicate <? super T > predicate ); // 根据给定的条件过滤流中的元素
< R > Stream < R > map ( Function <? super T , ? extends R > mapper ); // 将流中元素进行类型转换
Stream < T > distinct (); // 去重
Stream < T > sorted (); // 排序,如果存储元素没有实现 Comparable 或者相关集合没有提供 Comparator将抛出异常
Stream < T > limit ( long maxSize ); // 根据给定的上限,获取流中的元素
Stream < T > skip ( long n ); // 跳过给定数量的元素
IntStream mapToInt ( ToIntFunction <? super T > mapper ); // 将流中元素全部转为整数
LongStream mapToLong ( ToLongFunction <? super T > mapper ); // 将流中元素全部转为长整数
DoubleStream mapToDouble ( ToDoubleFunction <? super T > mapper ); // 将流中元素全部转为双精度浮点数

示例

import java . util . Arrays ;
import java . util . List ;
import java . util . Set ;
import java . util . function . Function ;
import java . util . function . IntFunction ;
import java . util . function . Predicate ;
import java . util . stream . Collectors ;
import java . util . stream . Stream ;
public class AggregateOperation {
        public static void main ( String [] args ) {
                // List<Integer> numbers = Arrays.asList(30,21,58,67,90,72);
                // for(Integer number: numbers){
                        // if(number % 2 == 0){
                                // System.out.println(number);
                        // }
                // }
                Stream < Integer > s1 = Stream . of ( 30 , 21 , 58 , 67 , 90 , 72 , 58 , 30 , 80 );
                // Stream<Integer> s2 = s1.filter(new Predicate<Integer>() {
                // @Override
                // public boolean test(Integer integer) {
                        // return integer % 2 == 0;
                // }
        // });
        Stream < String > s2 = s1 . filter ( number -> number % 2 == 0 ). distinct (). skip ( 1 ). sorted (). limit ( 2 ). map ( integer -> " 字符串 " + integer );
        s2 . forEach ( System . out :: println );
        //将流中的元素收集为一个 List 集合,此时流就已经消亡了
        // List<Integer> existNumbers = s2.collect(Collectors.toList());
        //再使用流进行收集操作时就将报错
        // Set<Integer> set = s2.collect(Collectors.toSet());
        // Integer[] arr = s2.toArray(new IntFunction<Integer[]>() {
        // @Override
        // public Integer[] apply(int value) {
                // return new Integer[value];
        // }
        // });
        //再使用流进行收集操作时就将报错
        // Integer[] arr = s2.toArray(Integer[]::new);
        // for(Integer number: arr){
                // System.out.println(number);
        // }
        }
}
import java . util . Arrays ;
import java . util . stream . DoubleStream ;
import java . util . stream . IntStream ;
import java . util . stream . LongStream ;
import java . util . stream . Stream ;
public class NumberStream {
        public static void main ( String [] args ) {
                Stream < String > s1 = Stream . of ( "1" , "2" , "3" , "4" );
                // IntStream s2 = s1.mapToInt(new ToIntFunction<String>() {
                // @Override
                // public int applyAsInt(String value) {
                        // return Integer.parseInt(value);
                // }
        // });
                // IntStream s2 = s1.mapToInt(value->Integer.parseInt(value));
                IntStream s2 = s1 . mapToInt ( Integer :: parseInt );
                int [] arr = s2 . toArray ();
                System . out . println ( Arrays . toString ( arr ));
                LongStream s3 =
                Stream . of ( "1" , "2" , "3" , "4" ). mapToLong ( Long :: parseLong );
                long [] arr2 = s3 . toArray ();
                System . out . println ( Arrays . toString ( arr2 ));
                DoubleStream s4 =
                Stream . of ( "1" , "2" , "3" , "4" ). mapToDouble ( Double :: parseDouble );
                double [] arr3 = s4 . toArray ();
                System . out . println ( Arrays . toString ( arr3 ));
        }
}

4. Stream 流终结操作

void forEach ( Consumer <? super T > action ); // 遍历操作流中元素
< A > A [] toArray ( IntFunction < A [] > generator ); // 将流中元素按照给定的转换方式转换为数组
< R , A > R collect ( Collector <? super T , A , R > collector ); // 将流中的元素按照给定的方式搜集起来
Optional < T > min ( Comparator <? super T > comparator ); // 根据给定的排序方式获取流中最小元素
Optional < T > max ( Comparator <? super T > comparator ); // 根据给定的排序方式获取流中最大元素
Optional < T > findFirst (); // 获取流中第一个元素
long count (); // 获取流中元素数量
boolean anyMatch ( Predicate <? super T > predicate ); // 检测流中是否存在给定条件的元素
boolean allMatch ( Predicate <? super T > predicate ); // 检测流中元素是否全部满足给定条件
boolean noneMatch ( Predicate <? super T > predicate ); // 检测流中元素是否全部不满足给定条件

示例

import java . util . Arrays ;
import java . util . List ;
import java . util . Optional ;
import java . util . Set ;
import java . util . function . Function ;
import java . util . function . IntFunction ;
import java . util . function . Predicate ;
import java . util . stream . Collectors ;
import java . util . stream . Stream ;
public class AggregateOperation {
        public static void main ( String [] args ) {
                List < String > numbers =
                Arrays . asList ( "30" , "21" , "58" , "67" , "90" , "72" );
                // Stream<String> s = numbers.stream();
                // Optional<String> first = s.findFirst();
                // System.out.println(first.get());
                // Optional<String> optional = s.max(String::compareTo);
                // String max = optional.get();
                // System.out.println(max);
                // System.out.println(s.count());
                // numbers.stream().map(new Function<String, Integer>() {
                // @Override
                // public Integer apply(String s) {
                        // return Integer.parseInt(s);
                // }
                // }).anyMatch(new Predicate<Integer>() {
                // @Override
                // public boolean test(Integer integer) {
                        // return integer % 2 == 1;
                // }
        // });
                boolean exist1 =
                numbers . stream (). map ( Integer :: parseInt ). anyMatch ( number -> number % 2 == 1 );
                System . out . println ( exist1 );
                boolean exist2 =
                numbers . stream (). map ( Integer :: parseInt ). allMatch ( number -> number % 2 == 1 );
                System . out . println ( exist2 );
                boolean exist3 =
                numbers . stream (). map ( Integer :: parseInt ). noneMatch ( number -> number % 2 == 1 );
                System . out . println ( exist3 );
        }
}

5. Stream 流聚合操作与迭代器的区别

Aggregate operations, like forEach, appear to be like iterators. However, they have several fundamental differences:
聚合操作(如 forEach )似乎像迭代器。但是,它们有几个基本差异:
They use internal iteration: Aggregate operations do not contain a method like next to instruct them to process the next element of the collection. With internal delegation, your application determines what collection it iterates, but the JDK determines how to iterate the collection. With external iteration, your application determines both what collection it iterates and how it iterates it. However, external iteration can only iterate over the elements of a collection sequentially. Internal iteration does not have this limitation. It can more easily take advantage of parallel computing, which involves dividing a problem into subproblems, solving those problems simultaneously, and then combining the results of the solutions to the subproblems.
它们使用内部迭代:聚合操作不包含诸如 next 的方法来指示它们处理集合的下一个元素。使用内部委托,你的应用程序确定要迭代的集合,而JDK 确定如何迭代该集合。通过外部迭代,你的应用程序既可以确定要迭代的集合,又可以确定迭代的方式。但是,外部迭代只能顺序地迭代集合的元素。内部迭代没有此限制。它可以更轻松地利用并行计算的优势,这涉及将问题分为子问题,同时解决这些问题,然后将解决方案的结果组合到子问题中。
They process elements from a stream: Aggregate operations process elements from a stream, not directly from a collection. Consequently, they are also called stream operations.
它们处理流中的元素:聚合操作从流中而不是直接从集合中处理元素。因此,它们也称为流操作。
They support behavior as parameters: You can specify lambda expressions as parameters for most aggregate operations. This enables you to customize the behavior of a particular aggregate operation.
它们支持将行为作为参数:你可以将 lambda 表达式指定为大多数聚合操作的参数。这使你可以自定义特定聚合操作的行为。

面试题

        使用Stream 流将一个基本数据类型的数组转换为包装类型的数组,再将包装类型的数组转换基本数据类型数组。
int [] intArr1 = { 1 , 2 , 3 , 4 , 5 };
        // Integer[] intArr2 = Arrays.stream(intArr1).mapToObj(new IntFunction<Integer>() {
                // @Override
                // public Integer apply(int value) {
                        // return value;
                // }
                // }).toArray(new IntFunction<Integer[]>() {
                // @Override
                // public Integer[] apply(int value) {
                        // return new Integer[value];
                // }
        // });
        // Integer[] intArr2 = Arrays.stream(intArr1).mapToObj(value ->value).toArray(Integer[]::new);
Integer [] intArr2 = Arrays . stream ( intArr1 ). boxed (). toArray ( Integer []:: new );
Integer [] intArr3 = { 1 , 2 , 3 , 4 , 5 };
int [] intArr4 =
Arrays . stream ( intArr3 ). mapToInt ( Integer :: intValue ). toArray ();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM架构简明教程

目录 一、ARM架构 1、RISC指令集 2、ARM架构数据类型的约定 2.1 ARM-v7架构数据类型的约定 2.2 ARM-v8架构数据类型的约定 3、CPU内部寄存器 4、特殊寄存器 4.1 SP寄存器 4.2 LR寄存器 4.3 PC寄存器 二、汇编 1、汇编指令&#xff08;常用&#xff09; 2、C函数的…

oracle数据库日常保养或巡检语句实践整理汇总

目录 1.目的 2.操作工具 3.实践说明 1.检查Oracle实例状态 2.检查Oracle在线日志状态 3.检查Oracle表空间状态 4.检查Oracle所有数据文件状态 5.检查Oracle数据库连接情况 6.检查Oracle表容量占用大小 7.检查Oracle备份 8.检查数据库表空间的使用情况 4.总结 1.目的 …

TSINGSEE青犀云边端技术如何助力视频监控实现高效管理与安全监控

随着信息技术的飞速发展&#xff0c;视频监控作为维护公共安全的重要手段&#xff0c;正逐渐融入人们的日常生活。在这个大数据、云计算、物联网等技术深度融合的时代&#xff0c;云边端技术作为一种新兴的技术架构&#xff0c;为视频监控带来了前所未有的变革与机遇。本文将以…

matlab 路面点云标线提取

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 算法来自本人自创。实现效果如下图所示,具体实现原理看代码即可。 二、代码实现 clc; cle…

@PathVariable`

PathVariable 是 Spring 框架中的一个注解&#xff0c;用于从请求的 URL 路径中提取变量并将其传递给控制器方法的参数。这在 RESTful 风格的 Web 服务中非常常见&#xff0c;通常用于处理路径参数。 使用场景 在 RESTful API 中&#xff0c;我们经常需要在 URL 路径中传递一…

办公楼导航系统:设计要点、功能实现与效益评估

随着现代办公楼的日益复杂化和规模化&#xff0c;如何高效、便捷地在楼宇内部进行定位和导航&#xff0c;已成为众多企业和员工关注的焦点。维小帮办公楼定位导航系统通过精准的定位和智能的导航功能&#xff0c;能够显著提升办公环境的智能化水平和办公效率。 一、维小帮办公…

k8s快速上手实操

前言 Kubernetes&#xff08;简称K8s&#xff09;是由Google开源的一个用于自动化部署、扩展和管理容器化应用程序的系统。自2014年发布以来&#xff0c;Kubernetes已经迅速成长为容器编排领域的标准&#xff0c;并在全球范围内得到了广泛的采用和认可。 Kubernetes作为现代容…

Mcgs屏幕脚本程序

目录 1.脚本程序概述1.1 脚本程序简介1.2 脚本程序编辑环境 2.脚本程序语言要素2.1 变量和常量2.2 对象2.3 事件2.4 表达式2.5 联行符2.6 运算符2.7 系统函数 3. 基本语句3.1 赋值语句3.2 条件语句3.3 循环语句3.4 跳出语句3.5 退出语句3.6 注释语句3.7 声明语句3.6 命名规则 1…

threejs视频融合 webgl

threejs三维视频融合 let objList []; const clock new THREE.Clock(); const container document.getElementById( container );const stats new Stats(); container.appendChild( stats.dom );const renderer new THREE.WebGLRenderer( { antialias: true } ); rendere…

Linux 防火墙 Firewall 和 Iptables 的使用

如果我们在Linux服务器的某个端口上运行了个服务&#xff0c;需要外网能访问到&#xff0c;就必须通过防火墙将服务运行端口给开启。Linux中有两种防火墙软件&#xff0c;CentOS7.0以上使用的是firewall&#xff0c;CentOS7.0以下使用的是iptables&#xff08;使用较少且不建议…

Jenkins+K8s实现持续集成(三)

接上面一篇JenkinsK8s实现持续集成&#xff08;二&#xff09;&#xff0c;K8s创建秘钥。 看secret kubectl get secret 删除secret kubectl delete secret hello-secret -n train 创建secret kubectl create secret docker-registry hello-secret --docker-server镜像仓库…

HarmonyOS【ArkUI组件--TextInput】

1.文本输入框基本用法 2. 使用文本输入框组件&#xff08;如何实现输入数字改变图片大小&#xff09; 在此博客的基础上继续编写&#xff1a;HarmonyOS【ArkUI组件--Text】-CSDN博客 ①代码如下&#xff1a; import font from ohos.font Entry Component struct Index {State …

开辟一个存储空间以存放一个结构体数据

在软件开发中&#xff0c;常常需要动态地分配和撤销内存空间&#xff0c;例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C提供了较简便而功能较强的运算符new和delete 来取代malloc和free函数。注意&#xff1a;new和delete是运…

软件测试机申请方案

1.概述 基于移动端的产品完成开发进入测试阶段时&#xff0c;该阶段要完成产品功能准确性、兼容性、易用性、可迁移性等等&#xff0c;为了最贴近用户真实场景&#xff0c;最大程度的发现问题&#xff0c;减少产品软件上线后的回归修复成本&#xff0c;需要使用真机进行测试&am…

白酒:酒文化传承中的挑战与机遇

随着时代的变迁&#xff0c;酒文化传承面临着许多挑战与机遇。我们来看看酒文化传承面临的挑战。随着现代生活方式的改变&#xff0c;人们对于传统酒文化的认知逐渐淡化。与此同时&#xff0c;年轻一代对于酒文化的兴趣不如老一辈浓厚&#xff0c;这使得酒文化的传承面临断层的…

vben-admin

table <style scoped lang"scss"></style><template><div><BasicTable register"registerTable"><template #toolbar><Button type"primary" click"handleCreatedAdd">添加</Button>…

每日复盘-202406018

今日关注&#xff1a; 20240617 20240618 六日涨幅最大: ------1--------300868--------- 杰美特 五日涨幅最大: ------1--------300868--------- 杰美特 四日涨幅最大: ------1--------300868--------- 杰美特 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨…

梅雨季机房运维注意事项

就在今天&#xff0c;江淮流域正式入梅啦。梅雨季雨水丰沛&#xff0c;机房运维要特别注意这些方面&#xff0c;以确保设备安全运行和数据中心的环境稳定。 首先&#xff0c;要防潮 具体措施 1、检查屋顶和墙壁密封性&#xff0c;确保机房屋顶和墙壁的密封性良好&#xff0c…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…

Android Jetpack组件简介

Android Jetpack 是一套用于构建 Android 应用程序的组件、工具和指南的集合&#xff0c;旨在简化开发流程、提高应用质量&#xff0c;并让开发者能够更快地发布应用。Jetpack 组件经过精心设计&#xff0c;可以解决常见的开发问题&#xff0c;减少样板代码&#xff0c;并帮助开…