stream操作常用API 示例详解

news2024/12/24 8:49:50

简介

从JDK8开始,增加了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑。

流式操作主要用来处理数据(比如集合),就像泛型也大多用在集合中一样。下面我们主要用例子来介绍下,流的基操。

:本博客相关代码请参考:Scott 数据 映射 MySQL

最终型

toArray

toArray:将流转换为数组。

示例:

@Test
public void fun5() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Object[] array = list.stream().toArray();
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}

结果:
image.png

collect

collect:将流转换为指定的类型,比如List转换为Set。

示例:

@Test
public void fun1(){
    String[] data = {"zhangsan","lisi","wanger","mazi"};
    List<String> list = Arrays.stream(data).collect(Collectors.toList());
    System.out.println(list);
    Set<String> set = Arrays.stream(data).collect(Collectors.toSet());
    System.out.println(set);
}

结果:
image.png

reduce

reduce:将元素合并起来,得到一个新值。可以简单理解为将一个数组或集合转换成一个String或integer类型的一个对象,最终结果为一个新值。
语法:reduce(a,(b,c)->{b+c})

  • a:规约初始值
  • b:阶段性的累加结果
  • c:当前遍历的元素
    注:若是整数类型求和 (Integer),b和c 可换成方法引用 Integer::sum

示例:

@Test
public void fun4() {
    String[] data = {"zhangsan", "lisi", "wanger", "mazi"};
    String reduce1 = Arrays.stream(data).reduce("", (v1, v2) -> v1 + v2);
    System.out.println(reduce1);

    Integer reduce2 = depts.stream().map(Dept::getDeptno).reduce(0, Integer::sum);
    System.out.println(reduce2);
}

结果:
image.png

iterator

iterator:将流转换为一个迭代器。

示例:

@Test
public void fun6() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Iterator<String> iterator = list.stream().iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

结果:
image.png

foreach

foreach:对流中的元素逐个遍历。
示例:

@Test
public void fun7() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    list.stream().forEach(System.out::println);
}

结果:
image.png

anyMatch/allMatch/noneMatch

  • anyMatch:用于判断是否有符合匹配条件的元素。
  • allMatch:用于判断是否所有元素都符合匹配条件。
  • noneMatch:用于判断是否所有元素都不符合匹配条件。

示例:

@Test
public void fun8() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    boolean b1 = list.stream().anyMatch(item -> item.contains("g"));
    System.out.println(b1);
    boolean b2 = list.stream().allMatch(item -> item.contains("g"));
    System.out.println(b2);
    boolean b3 = list.stream().noneMatch(item -> item.contains("g"));
    System.out.println(b3);
}

结果:
image.png

findFirst/findAny

  • findFirst:找到第一个匹配的元素后立即返回。
  • findAny:找到任何一个匹配的元素就返回。如果用在一个串行流中,跟findFirst效果一样。如果用在并行流中,就会比较高效。

示例:

@Test
public void fun9() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Optional<String> first = list.stream().findFirst();
    System.out.println(first.get());

    Optional<String> any = list.stream().findAny();
    System.out.println(any.get());

    int asInt = IntStream.range(10, 99).parallel().findAny().getAsInt();//并行
    System.out.println(asInt);
}

结果:
image.png

max/min

  • max:匹配元素最大值并返回。
  • min:匹配元素最小值并返回。

示例:

@Test
public void fun10() {
    int[] data = {88,23,45,92,18,46,78};
    OptionalInt max = Arrays.stream(data).max();
    System.out.println(max.getAsInt());

    OptionalInt min = Arrays.stream(data).min();
    System.out.println(min.getAsInt());
}

结果:
image.png

count

count:统计元素的个数,不会自动去重。
示例:

@Test
public void fun11() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi", "lisi", "qianwu");
    long count = list.stream().count();
    System.out.println(count);
}

结果:
image.png

中间型

filter

filter:按照指定的条件匹配出符合要求的元素,并返回一个新的stream流。
示例:

@Test
public void fun12() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    List<String> res = list.stream().filter(item -> item.length() > 4)
            .collect(Collectors.toList());
    System.out.println(res);
}

结果:
image.png

map

map:将一个对象转换为另一个对象,并返回一个新的stream流。比如,可以把数组中的元素从一种类型转换成另一种类型,也可以将多类型的集合变成单纯的只有一种类型的集合。

示例:

@Test
public void fun3(){
    String[] data = {"zhangsan","lisi","wanger","mazi"};
    List<Integer> list = Arrays.stream(data).map(String::length).collect(Collectors.toList());
    System.out.println(list);
}

结果:
image.png

示例:

@Test
public void fun4() {
    List<Integer> list = depts.stream().map(Dept::getDeptno).collect(Collectors.toList());
    System.out.println(list);
}

结果:
image.png

flatMap

flatMap:将已有的对象转换为另一个对象,它是一个一对多的逻辑。简单来说就是将多个stream流合并成一个stream。
flatMap与map的区别在于:

  • map是一对一的,即将一个对象转换为另一个对象
  • flatMap是一对多的,即将一个对象拆分对多个对象

示例:

@Test
public void fun17() {
    List<Dept> dept1 = new ArrayList<>();
    dept1.add(new Dept(10, "ACCOUNTING", "NEWYORK"));
    dept1.add(new Dept(20, "RESEARCH", "DALLAS"));

    List<Dept> dept2 = new ArrayList<>();
    dept2.add(new Dept(30, "SALES", "CHICAGO"));
    dept2.add(new Dept(40, "OPERATIONS", "BOSTON"));

    //map 一对一 映射处理
    dept1.stream()
            .map(dept -> {
                Dept build = dept.builder()
                        .deptno(dept.getDeptno() * 2)
                        .dname(dept.getDname().toLowerCase())
                        .loc(dept.getLoc().toLowerCase())
                        .build();
                return build;
            }).toList()
            .forEach(System.out::println);

    List<List<Dept>> depts = new ArrayList<>();
    depts.add(dept1);
    depts.add(dept2);
    //flatMap  一对多映射处理,深入到多个stream内部去处理子元素,统一输出
    depts.stream().flatMap(item -> item.stream()
                    .filter(dept -> dept.getDeptno() > 20))
            .toList()
            .forEach(System.out::println);
}

结果:
image.png


map和flatMap都可以将一个流的元素按照一定的映射规则映射到另一个流中:

  • map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
  • flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
    image.png

示例:

@Test
public void fun16() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    //接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
    List<String> res1 = list.stream().map(String::toUpperCase).toList();
    System.out.println(res1);

    //接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
    List<String> collect = list.stream().flatMap(item -> {
        String[] split = item.split("");
        Stream<String> stream = Arrays.stream(split);
        return stream;
    }).collect(Collectors.toList());
    System.out.println(collect);
}

结果:
image.png

peek

peek:对流中的元素逐个遍历处理,它与map的区别在于:map一般用于对象的转换,peek用于对象的消费,即不改变元素本身的类型。
示例:

@Test
public void fun13() {
    List<Integer> list2 = Arrays.asList(1,2,3,4);
    list2.stream()
            .peek(x -> System.out.println("stream: " + x)) //peek是对元素逐一消费
            .map(x -> x * 2) //map是对元素进行转换
            .peek(x -> System.out.println("map: " + x))
            .collect(Collectors.toList());
}

结果:
image.png

示例:

@Test
public void fun14() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    // 使用peek操作流,流中的元素没有改变。
    list.stream().peek(String::toUpperCase).forEach(System.out::println);
    // 使用map操作流,流中的元素有改变。
    list.stream().map(String::toUpperCase).forEach(System.out::println);
}

结果:
image.png

limit/skip

  • limit:就相当于sql中的limit,可以指定保留前N的元素。
  • skip:作用与limit相反,会抛弃前N的元素。

示例:

@Test
public void fun18() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi","qianwu","zhaoliu");
    list.stream().limit(3).toList().forEach(System.out::println);
    list.stream().skip(2).toList().forEach(System.out::println);
}

结果:
image.png

sorted

sorted:用于对流中的数据排序
示例:

@Test
public void fun22() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    list.stream()
            .sorted(Comparator.comparingInt(String::length))
            .toList()
            .forEach(System.out::println);
}

结果:

concat

concat:可以将多个流的数据合并为一个流。
示例:

@Test
public void fun20() {
    List<String> list1 = List.of("zhangsan", "lisi", "wanger");
    List<String> list2 = List.of("mazi","qianwu","zhaoliu");
    Stream.concat(list1.stream(),list2.stream())
            .toList()
            .forEach(System.out::println);

}

结果:
image.png

distinct

distinct:用于对流中的元素去重。
示例:

@Test
public void fun21() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi","lisi","mazi");
    list.stream().distinct().toList().forEach(System.out::println);
}

结果:
image.png

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

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

相关文章

Java两大工具库:Commons和Guava(4)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;在Nginx中提到过…

说一下Vue组件中的自定义事件和全局事件总线

一&#xff0c;自定义事件 1.自定义事件是什么 自定义事件一种组件间通信的方式&#xff0c;适用于 子组件 ——> 父组件传输数据等 2.要在什么地方使用 若App是父组件&#xff0c;School是子组件&#xff0c;School想给App传数据&#xff0c;那么就要在App中给School绑…

MySQL表中的聚合查询

聚合查询在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!1.聚合函数函数 说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DIST…

pod访问不通问题--kube-proxy未正常创建

用户问题Pod创建后访问对象存储OSS不通。初步排查初步排查&#xff0c;网络连通性是OK的。再次反馈创建Pod后2分钟内可能存在业务不通。业务架构该集群采用了节点自动弹缩功能&#xff0c;节点弹缩范围在13-28之间。用户周期性创建大批量Pod&#xff0c;共300个&#xff0c;与对…

46_API接口漏洞

API接口漏洞 一、概念 api > application interface 应用接口 向特定的接口发送一个请求包 返回一个类似于json格式的字符串 二、REST型web service 可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类 https://blog.csdn.net/t79036912/article…

Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘

1. 设置NAS&#xff0c;共享目录 1. 文件服务 设置 首先进入NAS服务&#xff0c;打开 [控制面板] &#xff0c;在控制面版包含** 文件服务 ** 功能如图所示。 2.选中要共享的文件夹后&#xff0c;点击操作栏的 【编辑】 按钮&#xff0c;如图&#xff1a; 3.进入编辑面板后&a…

盘点三个超好用的截图软件

一款好用的截图软件往往能给人们带来更高的工作效率&#xff0c;目前市面上的截图软件已经很多&#xff0c;今天就给大家盘点一些好用的截图软件。 QQ截图 QQ截图软件是QQ内置自带的一款截图&#xff0c;快捷键ctrlA 可以唤起&#xff0c;其功能也是应有尽有包括屏幕录制&#…

【JavaScript】数据劫持(代理)详解

&#x1f4bb; 【JavaScript】数据劫持(代理)详解 &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…

3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐

theme: channing-cyan highlight: github-gist 本人6年前端开发老鸟- 【程序员蜗牛】&#xff0c;欢迎沟通交流 操作演示&#xff08;视频&#xff09; 视频演示 项目背景 程序员工作中&#xff0c;不免会遇到一些技术难题&#xff0c;然后通过不懈努力将问题攻克&#xf…

1x1卷积、Inception网络、

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高&#xff0c;1x1卷积能压缩通道数量&#xff0c;减少计算成本。如上图&#xff0c;输入维度的通道数为192&#xff0c;用32个1x1x192的filters&#xff0c;就能将输出的通道数压…

【Rust】20. Rust 的高级特征

20.1 不安全 Rust 20.1.1 不安全的超能力 20.1.2 解引用裸指针 裸指针&#xff08;raw pointers&#xff09;&#xff1a;类似于引用类型&#xff1b;和引用一样&#xff0c;裸指针是不可变或可变的&#xff0c;分别写作 *const T 和 *mut T&#xff0c;这里的星号不是解引用运…

Kubernetes集群部署与实践

一、提要 部署Kubernetes集群至少需要3台服务器&#xff0c;其中至少要有1个服务器做master节点&#xff0c;至少要有1个服务器做node节点&#xff0c;且节点名称是唯一的。 当集群中只有一个master节点时&#xff0c;如果其出现了故障&#xff0c;会导致Kubernetes的控制平面…

规则引擎-drools-5-决策表

文章目录Excel格式决策表 官网地址决策表使用方式Excel组成部分与drl规则文件对应关系Excel文件内容示例drl规则文件内容Excel决策表内容说明1. RuleSet2. RuleTable3. Attributes示例Excel转化drl代码及结果执行drl代码及结果Excel格式决策表 官网地址 决策表这部分内容在官网…

几种IO模型

IO真正的IO操作涉及到和IO设备的交互&#xff0c;而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互&#xff0c;一般会使用操作系统的System Call&#xff0c;即系统调用&#xff0c;读是read()&#xff0c;写是write()&#xf…

设计模式-结构型模式

目录 5.结构型模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 JDK动态代理 5.1.5 CGLIB动态代理 5.1.6 三种代理的对比 5.1.7 优缺点 5.1.8 使用场景 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 应…

聊聊关于矩阵反向传播的梯度计算

目录 1. 前向传播 2. 反向传播 3. 矩阵反向传播 4. 总结 1. 前向传播 建立如图所示的简单网络 W 是权重矩阵&#xff0c;初始赋值为 2*2 的矩阵 X 是输入特征&#xff0c;初始赋值为 2*1 的矩阵 这样通过矩阵乘法 &#xff0c; Y WX &#xff0c;应该得到一个 2*1 的输…

在这竞争激烈的时代,如何才能够在激烈竞争中脱颖而出呢

不管是在职场想要获得认可得到晋升&#xff0c;还是与客户谈合作&#xff1b;都需要你能够脱颖而出。让他人能够看到你并且认可你。那如何才能脱颖而出呢&#xff1f;首先你要先认识自己&#xff0c;知道自己有什么优势、劣势、技能、兴趣、爱好等等。明确自己有什么价值&#…

软件工程(1)--初识基础概念

前言 学习了半年的软件工程课程&#xff0c;总不能一无所获吧&#xff0c;故此写下文章总结一番。 软件工程是一门综合性交叉学科&#xff0c;它涉及计算机科学、工程科学、管理科学和数学等领域。学习目标是掌握需求分析、软件设计、编码风格、软件测试的工程化方法。 软件程序…

什么是股票量化研究?

谈到股票量化研究领域&#xff0c;肯定少不了有自动交易系统的支撑&#xff0c;像平时能将股票池中的数据挖掘出来也能熟能生巧的进行自助量化研究&#xff0c;包括数据接口系统的开发使用都是受到量化的影响&#xff0c;那么&#xff0c;如何看待股票量化研究&#xff1f;像平…

arm版(以uos为例)linux安装mysql8

官网下载&#xff1a;https://downloads.mysql.com/archives/community/上传到服务器&#xff0c;然后解压缩tar -zxvf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gzmv mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql-8创建MySQL数据目录mkdir -p /datacd datamkdir …