如何用 Java Stream 写出 “高效率、干净、简洁” 的代码?

java 8 Stream(流) 目录 引言 一、Stream背景概述 1、背景 2、概念 3、特性 4、Stream流的思想 5、Stream流的好处 二、生成流 1、Collection体系集合生成 2、Map体系集合生成 3、数组生成 三、Stream流中间操作方法 1、概念: 2、常见方法: 3、方法展示加拓展 4、常用方法代码展示 filter代码演示 limit&skip代码演示 concat&distinct代码演示 sorted代码演示 map&map... 阅读详情

前后端微服务商城项目,手把手教学!

Java 常见的Stream流式编程

  • Java 8 添加了一个新的抽象称为流 Stream API,可以让你以一种声明的方式处理数据。

  • Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

  • Stream API 可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

ad36db09eef4848fea90347f3fb90f37.jpeg

如何创建流?

集合创建:
  • stream() − 为集合创建串行流。在串行流中,每个元素都是由同一个线程处理的,因此操作是顺序执行的。

  • parallelStream() − 为集合创建并行流。在并行流中,流会将集合分成多个子集,然后多线程并行处理这些子集中的元素。

/**
* 集合创建流
*/
List<String> list = new ArrayList<>();
//串行流
Stream<String> stream = list.stream();
//并行流
Stream<String> stream = list.parallelStream();
数组创建:

通过数组创建的方式有:Stream.of()、Stream.generate()、Stream.iterate()、IntStream、LongStream 等,如下代码。

/**
* 数组创建流
*/
String[] strs = new String[3];
Stream<String> stream1 = Arrays.stream(strs);

/**
* Stream.of() 创建流
*/
Stream<String> stream2 = Stream.of("Apple", "Orange", "Banana");

/**
* Stream.generate()创建流
*/
Stream<Double> randomStream = Stream.generate(Math::random).limit(5);

/**
* Stream.iterate()创建流
*/
Stream<Integer> integerStream = Stream.iterate(0, n -> n + 2).limit(5);

/**
* IntStream创建流
*/
IntStream intStream = IntStream.range(1, 5); // [1,2,3,4]

/**
* LongStream创建流
*/
LongStream longStream = LongStream.rangeClosed(1, 5); // [1,2,3,4,5]

通常,我们遍历一个集合时会使用 for(int i = 0; i < list.size(); i++) 这种方式,但是当我们有 IntStream 可用时,可以优化为使用 IntStream.rangeClosed(0, list.size() - 1).forEach(i -> {...}) 来遍历集合。

中间操作

过滤操作(filter )

过滤操作,可以保留满足过滤条件的元素。如下代码为:将 lists 流中的等于 1 的元素过滤出来,并打印结果。

/**
* filter 过滤操作
* @param lists
*/
public static void filterTest(List<Integer> lists){
 List<Integer> integers = lists.stream()
        .filter(list ->Objects.equals(1, list)).toList();
 integers.forEach(System.out::println);
}
映射操作(map / flatMap)

映射操作,可以对流中的每个元素提取并转换。如下代码为:

  • map 映射操作: 将 lists 流中的字符串,处理成大写的字符串;

  • flatMap 映射操作: 将 lists 流中的二位数组,转成一维数组。(flatMap 用于将流中的一个元素转换为一个流,然后将所有转换后的流组装成一个流)

/**
* map映射操作
*/
public static void mapTest(List<String> lists){
 lists.stream().map(String::toLowerCase).toList();
 lists.forEach(System.out::println);
}

/**
* flatMap映射操作,将嵌套集合转换为扁平集合
*/
public static void flatMapTest(List<List<String>> lists){
 lists = Arrays.asList(
  Arrays.asList("Java", "Kotlin"),
  Arrays.asList("Python", "Ruby"),
  Arrays.asList("JavaScript", "TypeScript")
 );
 List<String> wordList = lists.stream().flatMap(List::stream).toList();
 wordList.forEach(System.out::println);
}
mapToInt / mapToLong / mapToDouble 操作

mapToInt / mapToLong / mapToDouble 操作,可以将流中的元素映射为对应 int / Long / Double 类型,并进一步做数值计算。

public class Student{
    //年龄
    private int age;
    //姓名
    private String Name;
}
public static void mapTest(){
    int totalAge1 = students.stream().mapToInt(Student::getAge).sum();
    Long totalAge2 = students.stream().mapToLong(Student::getAge).sum();
    Double totalAge3 = students.stream().mapToDouble(Student::getAge).sum();
}
排序操作(sorted)

排序流中的元素。

/**
* 排序操作 sorted,对于集合对象排序,必须实现 Comparable接口,并重写 compareTo 方法,如果没有实现则需要给 sorted 函数传递参数
*/
public static void sortedTest(){
 List<String> cities = Arrays.asList("New York", "Tokyo", "London", "Paris");
 // 对城市按字母顺序排序
 List<String> sortedStream = cities.stream().sorted(Comparator.comparingInt(city -> city.charAt(1))).toList();
 sortedStream.forEach(System.out::println);
}
去重操作(distinct)

去除流中的重复元素。

/**
* 去重操作(distinct)
*/
public static void distinctTest(){
 List<String> cities = Arrays.asList("New York", "Tokyo", "London", "Paris");
 // 对城市去重
 List<String> distinctStream = cities.stream().distinct();
 sortedStream.forEach(System.out::println);
}
截断操作 / 跳过操作 / 观察操作(limit / skip / peek)
/**
* 截断操作(limit),只取流中前3个元素
*/
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 4, 5, 6); 
List<Integer> limitedList = numbers.stream().limit(3).collect(Collectors.toList());

/**
* 跳过操作(skip),跳过流中前3个元素
*/
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 4, 5, 6); 
List<Integer> limitedList = numbers.stream().skip(3).collect(Collectors.toList());

/**
* 观察操作,用于调试和观察流中的元素
*/
List<String> words = Arrays.asList("apple", "banana", "orange");  
List<String> modifiedWords = words.stream()  
        .filter(word -> word.length() > 5)  
        .peek(word -> System.out.println("Filtered Word: " + word))  
        .map(String::toUpperCase)  
        .peek(word -> System.out.println("Uppercase Word: " + word))  
        .collect(Collectors.toList());

终端操作

迭代操作(forEach)

迭代操作,可以用于遍历流中的每一个元素。

List<String> fruits = Arrays.asList("apple", "banana", "orange");
fruits.stream().forEach(fruit -> System.out.println(fruit));
//fruits.forEach(fruit -> System.out.println(fruit));
//fruits.stream().forEach(System.out::println);
收集操作(collect)

收集操作,可以将流转换为 List、Set、Map 等集合。通过 collect 函数,对流中的元素进行收集。

// 将学生流转换为 List
List<Student> limitStu = students.stream().collect(Collectors.toList());

// 将学生流转换为 Set
List<Student> limitStu = students.stream().collect(Collectors.toSet());

// 将学生流转换为 Map,将年龄作为 key,将学生信息作为 value (Function.identity() 为提取元素自身的函数,(e1, e2)-> e1 代表当两个学生年龄相同时,取第一个学生)
Map<Integer, Student> studentMap = students.stream().collect(Collectors.toMap(
           Student::getAge, 
           Function.identity(), 
           (e1,e2) -> e1));

//将学生的名字通过逗号拼接成一个字符串:studentName
String studentName = students.stream().map(Student::getName).collect(Collectors.joining(","));

//通过字符串的长度对 fruits 流分组
List<String> fruits = Arrays.asList("apple", "banana", "orange");  
Map<Integer, List<String>> lengthToNamesMap = fruits.stream()  
                    .collect(Collectors.groupingBy(String::length));

// counting(计算流元素个数)、maxBy(找到流中最大的元素)、minBy(找到流中最小的元素)、averagingInt(计算流中元素的平均值)、summarizingInt(计算流中元素的汇总统计信息,包括总数、平均值、最大值和最小值。)
partitioningBy(分组操作)
// 通过学生的年龄是否等于1进行分组,等于则分为 true 组,不等于则分为 false 组
Map<Boolean,List<Student>> partStudent = students.stream().collect(Collectors.partitioningBy(student -> Objects.equals(1,student.getAge())));
findFirst 操作

找到流中第一个元素。如下代码:找打学生流中第一个年龄等于1的元素。

Student firstStu = students.stream()  
        .filter(student -> Objects.equals(1, student.getAge()))  
        .findFirst().orElse(null);
findAny 操作

找到流中任何一个元素。如下代码:找打学生流中任何一个年龄等于1的元素。(相当于 findFirst 操作)

Student student = students.stream()  
        .filter(student -> Objects.equals(1, student.getAge())) 
        .findAny().orElse(null);
anyMatch 操作

检测是否存在一个或多个满足指定的参数行为,如果满足则返回true。

boolean result = students.stream()
  .anyMatch(student -> Objects.equals(1, student.getAge()));
noneMatch 操作

检测是否不存在满足指定行为的元素,如果不存在则返回true。

boolean result = students.stream()
  .noneMatch(student -> Objects.equals(1, student.getAge()));
allMatch 操作

检测是否全部都满足指定的参数行为,如果全部满足则返回true。

boolean result = students.stream()
  .allMatch(student -> Objects.equals(1, student.getAge()));

以上就是 Java 流式开发的介绍了,基本覆盖了日常工作中需要用到的 Java 流式操作。

来源:juejin.cn/post/7344026980616077350

推荐全新学习项目
全新基于springboot+vue+vant的前后端分离的微商城项目,包括手机端微商城项目和后台管理系统,整个电商购物流程已经能流畅支持,涵盖商品浏览、搜索、商品评论、商品规格选择、加入购物车、立即购买、下单、订单支付、后台发货、退货等。功能强大,主流技术栈,非常值得学习。
项目包含2个版本:
基于springboot的单体版本
基于spring cloud alibaba的微服务版本


线上演示:https://www.markerhub.com/vueshop

从文档到视频、接口调试、学习看板等方面,让项目学习更加容易,内容更加沉淀。全套视频教程约44小时,共260期,讲解非常详细细腻。下面详细为大家介绍:
架构与业务使用主流的技术架构,真正手把手教你从0到1如何搭建项目手脚架、项目架构分析、建表逻辑、业务分析、实现等。
单体版本:springboot 2.7、mybatis plus、rabbitmq、elasticsearch、redis
微服务版本:spring cloud alibaba 2021.0.5.0,nacos、seata、openFeign、sentinel
前端:vue 3.2、element plus、vant ui

更多详情请查看:
手把手教学,从0开发前后端微商城项目,主流Java技术一网打尽!

手把手教学,从0开发前后端微商城项目,主流Java技术一网打尽!

手把手教学,从0开发前后端微商城项目,主流Java技术一网打尽!
如何利用Java的Stream API提高代码的简洁度和效率? 本文介绍了Java 8的Stream API及其在代码优化中的应用。Stream API提供了一种声明式、函数式的编程方式,可以简化集合操作,提高代码可读性和效率。文章详细讲解了Stream的创建方法(集合、数组、Stream.of())、常见中间操作(filter、map、distinct、sorted、limit)和终止操作(forEach、collect、reduce),并通过代码示例展示了其使用方法。Stream API支持惰性计算和并行处理,能有效提升程序性能。适合Java开发者学习使用Strea 阅读详情

相关推荐

企业微信会话存档SDK集成与动态库加载实战

本文详细解析了企业微信会话存档SDK的集成与动态库加载实战,重点解决Windows与Linux环境下动态库加载的差异问题。通过实战案例和优化建议,帮助开发者高效完成企业微信API集成,确保合规存档功能稳定运行。

weixin_26934905的博客 465

Java8 之stream()操作

然后, 我们惊喜的发现和上面的代码运行结果是一制的, 我们基本上可以断定, 上面那种写法是下面这种的一种缩写形式。

2401_85958299的博客 1174

保姆级教程:手把手教你从NASA Earthdata免费下载ASTER L2地表温度数据(附shp文件拖拽技巧)

本文提供了一份详细的ASTER L2地表温度数据下载指南,涵盖从NASA Earthdata注册、数据定位到shp文件拖拽技巧的全流程。特别针对新手常见问题如邮箱选择、密码设置、云量筛选等给出实用解决方案,帮助用户高效获取遥感数据并避免常见陷阱。

weixin_42662605的博客 426

【Java】System.out.println

System.out.println() System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台 System是Java.lang包中的一个final类,该类提供的设施包括标准输入、标准输出和错误输出流、访问外部定义的属性和环境变量,一种加载文件和库的方法,以及用于加速复制数组等一部分的使用方法。 out是System类的静态成员字段,类型为PrintSt...

Ankie_的博客 1万+

Marin说PCB之LPDDR5的布线注意事项--03

这个规则中是把每个字节中的WCK to RDQS 以及DM / DQ to WCK等长规则都加到了DM / DQ这个等长规则中去了,因为芯片手册上的设计要求中的DM / DQ这个group的等长误差是+-50MIL, WCK to RDQS的等长group的规则是62.5MIL,DM / DQ to WCK等长group的规则是相对松一些是150MIL。其实上面的等长规则还是建少了一些的,例如手册上要求的每个channel的WCK0:1,WCK2:3等长误差在+-488MIL,这个规则建议还是补上去吧。

weixin_45223454的博客 1231

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3953

Java8 Stream常见用法

Java8 Stream常见用法

小蜜蜂vs码农 2884

让AI镜头“活”起来:22个核心运镜提示词,告别视频画面呆板

介绍了22种影视级镜头语言的AI提示词用法。内容涵盖推轨/后拉镜头等距离变化技巧、横摇/俯仰等方向控制手法、环绕/升降等空间位移方式,以及POV视角等特殊构图。

weixin_43489601的博客 6291

Java--Stream流详解

Stream是Java 8 API添加的一个新的抽象,称为流Stream,可以一种声明的方式处理数据 stream().filter()一般适用于list集合过滤list中的数据,主要作用就是模拟sql查询,从集合中查询想要的数据,不用像之前一样遍历list再筛选 orElse(null)表示如果一个都没找到返回null(orElse()中可以塞默认值。如果找不到就会返回orElse中设置的默认值) orElseGet(null)表示如果一个都没找到返回null(orElseGet()中可以塞默认值。

MinggeQingchun的博客 9万+

PCL 使用点云创建数字高程模型DEM【2025最新版】

使用点云创建数字高程模型DEM,并将结果保存为高程图像。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2296

数据分享】中国12.5m数字高程模型(DEM)数据(分省)

数据名称:ALOS 12.5m DEM 数据。数据名称:ALOS 12.5m DEM 数据。数据大小:61.5GB。空间分辨率:12.5m。数据大小:61.5GB。空间分辨率:12.5m。

JData_Engineer的博客 5392

用 Java Stream 写出 “高效率、干净、简洁” 的代码

过滤操作,可以保留满足过滤条件的元素。如下代码为:将 lists 流中的等于 1 的元素过滤出来,并打印结果。通过 collect 函数,对流中的元素进行收集。如下代码:找打学生流中任何一个年龄等于1的元素。如下代码:找打学生流中第一个年龄等于1的元素。检测是否存在一个或多个满足指定的参数行为,如果满足则返回true。检测是否不存在满足指定行为的元素,如果不存在则返回true。映射操作,可以对流中的每个元素提取并转换。迭代操作,可以用于遍历流中的每一个元素。操作,可以将流中的元素映射为对应。

justlpf的专栏 255

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1659

玩转 Java8 Stream,让你代码更高效紧凑简洁

聆听 沉淀 传播 … 关注微信公众号【Java之言】,助你放弃编程之路! 文章目录前言一、Stream 特性二、Stream 创建2.1 用集合创建流2.2 用数组创建流2.3 Stream静态方法三、Stream 使用案例3.1 遍历 forEach3.2 过滤 filter3.3 查找 findFirst,findAny3.4 匹配 match3.5 映射 map3.6 截取流 limit3.7 排序 sorted3.8 去重 distinct3.9 统计 前言 Java 8 (又称为 jdk.

陈皮的JavaLib 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

详解Java 8 中使用Stream将List转为Map

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 下面将详细讲解在Java 8 中如何使用Stream将List转换为Map,使用Collectors.toMap方法进行转换。 背景:User类,类中分别有id,name,age三个属性。List集合,use...

菜鸟技术栈的专栏 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

用了多年Java,你的团队会使用Java8 Stream API吗?

熟练掌握Java8 Stream API能使你的代码更加简洁。对于Java8这种“链式”编程的风格到底是否应该推荐使用也是见仁见智,网上很多人说Stream API如果写的很长,确实可以减少代码,但这样会导致逻辑不够清晰,写的人很爽,看的人难受。笔者所在技术团队目前还没有大量使用Stream API,大家还是习惯于用平常的语法来写业务逻辑。 你所在的团队会大量的用到Stream API来减少代码量吗?欢迎给我留言~

果子爸聊技术 1万+

Java中的排序问题(Java8新特性 stream流、stream多字段排序)

1、概要 Java 8 API添加了一个新的抽象成为流Stream,它以一种声明的方式处理数据,最后由最终操作得到前面处理的结果。 Stream专注于集合对象的操作,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 Stream在处理大批量数据操作中更加高效。 St...

No8g攻城狮的博客 6991

总结:Java8之Stream

Java8新特性 集合讲的是数据,流讲的是计算 ...

w2009211777的专栏 966

超高效率!使用Java8的Stream对集合进行操作

超高效率!使用Java8的Stream对集合操作飞起来 前言 今天博主将为大家分享超高效率!使用Java8的Stream对集合操作飞起来,用时最短!不喜勿喷,如有异议欢迎讨论! 有一个强大的地基才能写出健壮的程序! 简介 java8 也出来好久了,接口默认方法,lambda 表达式,函数式接口,Date API 等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下 lamb...

Mr_chen的博客 1924

java流式数据处理stream

说明 java 8种添加了一种声明的方式处理数据Stream。可以让程序员写出高效率、干净、简洁的代码。这种风格将元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 如筛选, 排序,聚合等。 forEach 用来迭代流中的每个数据 List<Integer> numbers = Arrays.asList(1, 2, 3); numbers.stream().forEach(System.out::println); filter 用于过滤元素 List<Integ

u010825190的博客 518

Java8-Stream

概述 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行...

记录日常的点点滴滴 1288

java8 stream详解和使用

javajava8 stream使用介绍什么是 Stream?代码演示forEach 循环filter 过滤map 映射flatMap 转换sorted 排序distinct 去重复count 总数量min、maxskip、limitcollect 收集concat 合并anyMatch、allMatch 任意匹配 全匹配reduce 归纳findFirst、findAny 查找第一个和任意一个流...

princejwg的博客 6225
上一篇: 艺虎酒店预订网,酒店管理,基于Springboot3+Vue3,从0开发!
下一篇: 医院预约挂号系统,基于Springboo3+Vue3,从0带做,可用于毕业设计,项目实战!...
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值