stream操作常用API 示例详解

30 篇文章 3 订阅
订阅专栏
本文介绍了Java8引入的StreamAPI,包括toArray、collect、reduce、forEach等基本操作,展示了如何使用这些API优雅地处理数据,如转换数组、集合、合并元素以及对数据进行过滤、映射和排序等。
摘要由CSDN通过智能技术生成

简介

从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

示例:将List转换为用逗号隔开的字符串

public static <T> String listToStr(List<T> list){
     String result = list.stream().map(String::valueOf).collect(Collectors.joining(","));
     return result;
}

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

  • 使用peek操作流,流中的元素不会改变
  • 使用map操作流,流中的元素会改变
    示例:
@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

JDK 1.8-Stream常用API
jishamo的专栏
05-06 350
JDK 1.8-Stream常用API 1. Stream Stream是一组用来处理数组,集合的API 1.1特性 不是数据结构,没有内部存储 不支持索引访问 延时计算 支持并行 很容易生成数据或集合 支持过滤,查找,转换,汇总,聚合等操作 1.2缺点 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。 不容易使用debug模式调试。 在 lambda 语句中直接强制类型转...
Stream学习:StreamAPI详解
weixin_40443666的博客
09-03 1537
Java8新特性 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 Stream流Java8新特性前言一、Stream 总览1.什么是流2.流的构成二、流的使用详解1.流的构造与转换2.流的操作总结 前言 Java8之前的集合操作不能满足需求的快速发展。所以Steam应运而生。 Stream是对容器对象功能的增强,专注于对容器对象进行各种便利、高效的聚合操作(aggregate operation)或者大批量数据操作。 它提
Stream常用API
m0_58768327的博客
03-13 429
package com.maxinyang.stream; import com.maxinyang.excel.User; import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** .
Lambda表达式与Streams API结合使用
最新发布
weixin_44719499的博客
09-19 807
Java匿名内部类是一种没有名字的类,通常用于实现接口或继承类的临时实现场景,特别适用于一次性使用的场景,例如事件处理、线程等。它简化了代码,但在调试和代码复用上存在一定的局限性。
Stream常用API
一位普普通通程序员的博客
09-08 1513
JDK8新特性------Stream流的常用API
Stream Api一览
wangzili1995的博客
09-17 545
Stream ​ Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是Stream API(java.uti1.stream.*)。 Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 什么是Stream 流(
Stream一些常用API
weixin_48656058的博客
02-21 203
Stream一些常用API
java中stream常用API
weixin_57279728的博客
08-21 601
reduce(BinaryOperator):使用指定的二元操作(BinaryOperator),对流中的元素进行归约操作,返回一个Optional。flatMap(Function):对流中的每个元素,通过给定的转换函数(Function)进行转换,并将结果流扁平化为一个流。map(Function):对流中的每个元素,通过给定的转换函数(Function)进行转换,返回转换后的元素流。filter(Predicate):通过给定的条件(Predicate),过滤流中的元素,返回满足条件的元素流。
Java Stream操作详解示例
"该资源主要涉及Java编程语言中的Stream API使用方法,包括常见的操作如peek、sorted、map、collect、joinning、skip以及Comparator的使用。" 在Java 8中,Stream API引入了一种新的处理数据的方式,使得对集合的...
Java8如何构建一个Stream示例详解
08-27
Java 8 的 Stream API 提供了一种强大且灵活的数据处理方式,它简化了集合操作,并引入了并行计算的概念。通过学习和熟练掌握 Stream API,开发者可以写出更高效、更易于理解的代码。无论是从现有数据结构创建 ...
Java8 Stream API与Guava操作详解
"Stream API函数式编程和Guava操作" Stream API是Java 8引入的一个重要特性,它提供了处理集合的新方式,特别是在大规模数据处理时,能够实现更高效、更简洁的代码。Stream API的设计理念源自函数式编程,使得...
使用Java Api操作HDFS过程详解
08-25
使用Java API 操作 HDFS 过程详解 Java 应用程序接口(API)是 Java 语言提供的一组编程接口,用于访问和操作 Hadoop 分布式文件系统(HDFS)。本文将详细介绍使用 Java API 操作 HDFS 的过程,并提供了一个示例...
Stream常用API
Forevermark的博客
08-24 391
Java8 中有两大最为重要的改变,第一个是 Lambda 表达式,另外一个则是 Stream API。 流是 Java8 引入的全新概念,它用来处理集合中的数据。 众所周知,集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像 SQL 语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。 在项目中使用 Stream API 可以大大提高效率以及代码的可读性,使我们对数据进行处理的时候事半功倍。
stream常用API
wangshanlong_的博客
08-20 360
​ 3. flatMap:将集合中的每个元素映射为多个元素,并将结果合并成一个流。​ 12. anyMatch:判断集合中是否存在满足条件的元素。​ 15. findFirst:查找集合中第一个符合条件的元素。​ 16. findAny:查找集合中任意一个符合条件的元素。​ 10. forEach:对集合中的每个元素执行一个操作。​ 8. reduce:将集合中的元素逐个聚合成一个结果。​ 9. collect:将集合中的元素收集到一个集合中。​ 2. map:将集合中的每个元素映射为另一个元素。
ASP.NET MVC Web API使用示例
weixin_33686714的博客
03-16 491
上篇博客讲解rest服务开发时,曾经提到过asp.net mvc中的rest api,由于篇幅原因,没有在上篇博客中进行讲解,这里专门拿出来进行讨论。还是一样引用上次的案例,用asp.net mvc提供的web api来进行IP地址归宿地查询接口的开发。由于我机器装的是win8企业版操作系统,VS版本是2012,因此我们选择使用VS自带的MVC4模版中的Web API来创建一...
Stream流的常用API
cgj-horizons
07-09 551
注意:中间方法也称为非终结方法,调用完成后返回新的stream流可以技术使用,支持链式编程在stream流中无法直接修改集合、数组中的数据 终结操作方法foreach和count注意:终结操作方法,调用完成后流就无法继续使用了,原始是不会返回stream流了...
JavaSE 一些技巧 03——Stream常用API
m0_46507516的博客
09-25 436
Stream常用Api
写文章

热门文章

  • JRebel2023.3 插件使用详解 179877
  • Ubuntu20.04开放指定端口 65944
  • EasyCode插件使用详解 51409
  • yum安装telnet 44709
  • Element UI中el-date-picker设置日期格式 39956

分类专栏

  • uniapp 2篇
  • TODO 6篇
  • Intellij 73篇
  • Vue 122篇
  • SpringBoot 182篇
  • JavaSE 79篇
  • Java新特性 30篇
  • JDBC 15篇
  • 数据库连接池 5篇
  • 设计模式 21篇
  • 多线程 10篇
  • 第三方库 41篇
  • 工具类 47篇
  • 加解密 11篇
  • 日志处理 5篇
  • JSON 13篇
  • JavaWeb 66篇
  • 测试 12篇
  • Python 4篇
  • 大数据 1篇
  • Spark 5篇
  • avro 4篇
  • Hive 31篇
  • Hadoop 43篇
  • Kafka 12篇
  • HBase 19篇
  • Sqoop 4篇
  • Zookeeper 10篇
  • Flume 11篇
  • Elasticsearch 4篇
  • 框架及中间件 1篇
  • MyBatis / MyBatisPlus 65篇
  • Spring 37篇
  • SpringMVC 29篇
  • SpringData 8篇
  • SpringSecurity / Shiro 24篇
  • ActiveMQ 7篇
  • Freemarker / Thymeleaf 28篇
  • 微服务 21篇
  • Scala 9篇
  • Docker 12篇
  • Redis 36篇
  • 数据库
  • MySQL / MariaDB 53篇
  • MongoDB 12篇
  • 前端
  • nodejs 4篇
  • HTML/CSS 17篇
  • TypeScript/JavaScript/JQuery 73篇
  • Semantic UI 36篇
  • 其他 4篇
  • Linux 64篇
  • 文件服务器 10篇
  • 项目 22篇
  • JavaWeb代码生成器 3篇
  • 基于角色的权限管理系统 3篇
  • 谷粒影音 2篇
  • Android 9篇
  • 开发工具 72篇
  • Maven 22篇
  • 考试面试 35篇
  • 常见错误 64篇
  • 大学课程
  • R语言 7篇
  • 基于文件的图书管理系统 4篇
  • 数据可视化 4篇
  • 数据分析 5篇
  • 企业员工管理系统 6篇
  • 数据可视化系统 6篇
  • 架构 16篇
  • 杂谈 12篇

最新评论

  • Intellij中单击New Project无效

    Sunshine°暖阳✧: 后来怎么解决得表情包

  • String字符数组转成Long列表或数组

    xjq191020: Long[] 数组 也可以这样 long[] nums = Arrays.stream(ids.split(",")).mapToLong(Long::parseLong).toArray();

  • E492: Not an editor command: WQ

    梁云亮: 收到,感谢!

  • npm配置镜像

    CSDN-Ada助手: 能否谈谈前端项目的静态资源CDN化呢?

  • E492: Not an editor command: WQ

    青青草原看星星: 注意大小写

最新文章

  • springboot 同时上传文件和JSON对象
  • 解决AndroidStudio重复下载gradle文件的问题
  • Python简介
2024
10月 8篇
09月 7篇
08月 1篇
07月 1篇
06月 16篇
05月 21篇
04月 4篇
03月 5篇
02月 5篇
01月 1篇
2023年119篇
2022年209篇
2021年287篇
2020年490篇
2019年233篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁云亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家武威广场玻璃钢雕塑哪家好济源校园玻璃钢雕塑楚雄玻璃钢景观雕塑玻璃钢动物雕塑生产厂家仿真玻璃钢雕塑推荐货源无锡玻璃钢卡通雕塑设计新密肖像玻璃钢雕塑宿州玻璃钢雕塑制作公司天津玻璃钢仿铜雕塑厂家抚州公园玻璃钢雕塑景观玻璃钢卡通雕塑费用中山市玻璃钢雕塑工艺商场美陈ins北京境度空间玻璃钢雕塑造型珠海玻璃钢卡通人物雕塑供应厂家德阳玻璃钢仿铜雕塑价格江西欧式玻璃钢雕塑定做价格嘉兴玻璃钢人物雕塑制作张家界玻璃钢群马雕塑玻璃钢雕塑制作工艺有几种台州玻璃钢雕塑供应商山东个性化玻璃钢雕塑联系方式宿州制作玻璃钢雕塑厂报价玻璃钢人物雕塑批发价安徽抽象玻璃钢雕塑方法特色玻璃钢雕塑摆件设计陕西玻璃钢卡通雕塑价格广州商场美陈创意太原人物玻璃钢雕塑优势商场美陈花境香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化