Java8新特性之Stream API

Stream Api详解 Stream api详解 阅读详情

概述

Stream API 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。总得来说,Stream API 就是提供了一种高效且易于使用的处理数据的方式。

注:需要会使用 Lambda 表达式 地址


Stream 的流

Stream 不是集合元素,它不是数据结构并不保存数据,而属于流。
流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
区别:集合注重的是数据的保存,而流注重的是数据的计算

Stream 流的特点:

  • 不会存储元素
  • 不会改变源对象
  • 操作是延迟执行的

流的使用步骤:

  • 获取一个数据源
  • 数据转换,即中间操作
  • 执行操作获取想要的结果并终止操作

通过数据源创建 Stream 流
1.Collection

		List<String> list = new ArrayList<>();
		Stream<String> stream1 = list.stream();
		Stream<String> stream2 = list.parallelStream();

注:parallelStream获取的是并行执行的流,底层使用的是 ForkJoin框架
2.数组

		Stream<T> stream3 = Arrays.stream(T array);//int,long,double

3.值

		Stream<String> stream4 = Stream.of("a","b","c");

4.函数(无限流)

		Stream<Integer> stream5 = Stream.iterate(0, (x) -> x + 2);
		Stream<String> stream6 = Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);

流的中间操作
两类操作:

  • Intermediate(中间操作):可以有多个,即对流的数据进行映射或者过滤,每一个操作会返回一个新的流给下一个操作。这类操作是惰性的,即此时还没有对流进行遍历,操作也还没有真正执行。
  • Terminal(终止操作):只能有一个,执行前会将Intermediate的多个操作融合起来,该操作执行时才会真正的遍历流并消耗流,最终会返回一个结果。

常见的操作:

  • Intermediate:
    map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 findFirst、 peek、 limit、 skip、 parallel、 sequential、 unordered
  • Terminal:
    forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

举例

1.filter(过滤)、forEach(遍历)

		int[] nums = {2,1,4,5,8};
		IntStream stream = Arrays.stream(nums);
		stream.filter((x) -> x%2==0).forEach(System.out::println);

输出结果如下:
1
2.limit(返回前n个)、skip(丢弃前n个)、sorted(排序)

		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		Stream<Integer> stream = list.stream();
		list = stream.limit(5).skip(2).sorted((a,b) -> b.compareTo(a)).collect(Collectors.toList());
		System.out.println(list);

输出结果如下:
在这里插入图片描述
3.allMatch(所有)、anyMatch(存在)、noneMatch(没有)

		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		boolean flag = list.stream().allMatch(x -> x > 2);
		System.out.println("allMatch:"+flag);
		flag = list.stream().anyMatch(x -> x > 2);
		System.out.println("anyMatch:"+flag);
		flag = list.stream().noneMatch(x -> x > 2);
		System.out.println("noneMatch:"+flag);

输出结果如下:
在这里插入图片描述
4.min、max、distinct(不重复)

		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(2);
		int a = list.stream().max(Integer::compare).get();
		System.out.println("max:"+a);
		a = list.stream().min(Integer::compare).get();
		System.out.println("min:"+a);
		list = list.stream().distinct().collect(Collectors.toList());
		System.out.println(list);

输出结果如下:
在这里插入图片描述
5.map、flatMap(把 input Stream 的每一个元素,映射成 output Stream 的另外一个元素,flatMap对应一对多情况)

		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list = list.stream().map(String::toUpperCase).collect(Collectors.toList());
		System.out.println(list);

输出结果如下:
在这里插入图片描述

注:
1.Collector是专门用来作为Stream的collect方法的参数的,而 Collectors 是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,如:

  • toCollection
  • toList
  • toSet
  • counting
  • …

2.无限流一般需要有限制的操作,如:anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit 等

深入探讨Java 8新特性:Stream API和Optional类! 本文深入探讨了Java 8引入的Stream API和Optional类两大特性。Stream API通过声明式编程简化集合操作,支持过滤、映射、排序等常见操作,并提供了高效的并行流处理。Optional类则有效避免了NullPointerException,通过安全容器机制优雅处理空值。文章详细讲解了它们的创建方式、常用方法及适用场景,为开发者提供了优化代码、提升效率的实用指南。这两项特性已成为现代Java开发的必备技能,能显著提高代码质量和可维护性。 阅读详情

相关推荐

掌握Java 8新特性:Stream API与Lambda表达式

Java 8,作为Java历史上一次重大的更新,引入了诸多改变游戏规则的新特性,这些特性不但提升了开发效率,还极大地扩展了Java语言表达能力。其中,Lambda表达式、Stream API、新的日期时间API、Optional类等成为Java 8最大的亮点。这些特性标志着Java从面向对象编程向函数式编程迈出了重要的一步。本章将对Java 8的这些核心特性进行概览,并简要介绍它们各自的特点与作用。

weixin_33610780的博客 998

Java8新特性:StreamAPI(超详解)

用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,Stream讲的是计算!Stream关注的是对数据的运算,与CPU打交道,集合关注的是数据的存储,与内存打交道。Stream 自己不会存储元素。Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

weixin_52533007的博客 1万+

工业相机图像格式深度解析:从Mono8到Mono12的选型与应用

本文深度解析工业相机黑白图像格式,重点对比Mono8、Mono10与Mono12的核心差异。文章从位深、动态范围和数据量等关键概念切入,详细阐述了不同格式的优缺点及适用场景,为工业视觉项目中的相机选型提供实战指南,帮助用户在精度、速度与成本间做出最优决策。

weixin_29207439的博客 260

Java中的Stream API详解

Stream API是一种处理集合的高级抽象。它能够提供一种声明性的方法来处理数据集合(例如ListSet和Map),并且支持函数式编程的风格。Stream的主要目的是让你以声明性风格处理数据集,而不是以传统的命令式风格。Stream API在Java中提供了一种强大且灵活的方式来处理数据集合。通过使用Stream API,可以编写更加简洁和可维护的代码,并利用流的并行处理能力提升性能。然而,在使用Stream API时,也需要关注性能和资源的使用,确保代码的高效和稳定。

m0_73467713的博客 3176

稚晖君Dummy机械臂CAN总线控制详解:从代码到实战(附常见问题排查)

本文深入解析了稚晖君Dummy机械臂的CAN总线控制技术,从协议设计到代码实现,详细介绍了CAN总线在机械臂控制中的核心价值、通信协议栈设计、运动控制指令实现及常见问题排查方法。通过实战案例和代码示例,帮助开发者快速掌握机械臂CAN总线控制的关键技术。

uuu88的博客 293

我的交叉验证翻车实录:从‘炼丹’到可靠评估,我是怎么用五折验证拯救我的图像分割模型的

本文分享了作者在医学图像分割模型评估中从失败到成功的实战经验。通过引入五折交叉验证方法,解决了传统数据划分的局限性,显著提升了模型评估的稳定性和泛化能力。文章详细介绍了Python实现、数据准备策略和训练流水线改造,为AI医疗影像分析提供了可靠的技术方案。

weixin_42625070的博客 267

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例,文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同,强调了其在现代 Java 开发中的重要性和实用性。

踏雨歌青春,诗酒趁年华 1万+

ROS牛耕法全覆盖规划:从算法原理到清洁机器人实战解析

本文深入解析ROS牛耕法全覆盖规划算法在清洁机器人中的应用,从算法原理到实战优化技巧全面覆盖。详细介绍了地图预处理、区域分解和路径优化等关键步骤,并分享实际案例中的解决方案,帮助开发者提升机器人清扫效率和覆盖率。

weixin_27013291的博客 390

Stream API

从JDK1.8开始,Java语言引入了一个全新的流式Stream API,StreamAPI把真正的函数式编程风格运用到Java语言中,使用StreamAPI可以帮我们更方便地操作集合,允许开发人员在不改变原始数据源的情况下对集合进行操作,这使得代码更加简洁、易读和可维护。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用Stream API来并行执行的操作。简而言之,Stream API提供了一种高效且易于使用的处理数据的方式。

weixin_61635597的博客 598

使用基于python的neurora进行表征相似性分析(RSA)

发现了一款用于表征分析的Python API,还是挺方便的,这里简单介绍一下进行表征相似性分析的使用方法。

zjh12312311的博客 2764

数字太大放不下,高精度来补,如何放下超大数字,以及进制转换,高精度真的超好玩。 洛谷1009,1015

想必大家都遇到过数字大小超过int类型范围的情况,是不是碰到int放不下的数字自然就会想到,long int,long long int,甚至unsigned long long int呢。但是有一些出题者就很可恶,偏要出一些连unsigned long long int也放不下的算法题,应对这些问题时,我们是否有相应的应对方法呢?答案是:当然有,高精度就是一种应对这种问题时很好的解决办法。相信你在看完这篇文章后能对高精度有着更深更好的理解。我会循序渐进的来讲,这样大家也更容易听懂。

2303_79329831的博客 1229

Java 8 Stream API 新特性详解及实践

Java 自从推出 8.0 版本以来,带来了许多全新的特性,比如 Lambda 表达式、Stream API、函数式接口等,这些特性极大地提升了开发效率和代码可读性。其中,Stream API 是用于处理集合的强大工具,能够以声明性方式执行复杂的数据处理任务,而不必显式编写迭代逻辑。 本文将通过一个示例代码,详细介绍 Stream API 的特点及用法,并扩展讨论 Java 8 新特性的其他重要方面。通过深入分析,帮助读者理解如何高效利用这些新特性编写简洁、优雅的代码。

cooldream2009的博客 1028

大学生作业:80C51存储器数据传输实验:基本指令和数据传送

大学生作业:80C51存储器数据传输实验,报价 200 文章目录实验一、80C51存储器数据传输实验实验目的:实验内容一:基本指令实验内容二:数据传送 实验一、80C51存储器数据传输实验 实验目的: 熟悉软件的集成开发环境 掌握单片机软件设计流程,掌握存储器结构及各窗口之间的联系 掌握内部数据存储器、外部数据存储器的数据传送特点和应用; 实验内容一:基本指令 用三种方法实现将累加器A内容改为20H ORG 0000H LJMP MAIN ORG 0030H MAIN: ;方法一使用寄

weixin_54707168的博客 5099

Java8 新特性 —— Stream API 详解

Stream作为Java 8的一大亮点,它专门针对集合的各种操作提供各种非常便利、简单、高效的API,Stream API主要是通过Lambda表达式完成,极大的提高了程序的效率和可读性,同时Stram API中自带的并行流使得并发处理集合的门槛再次降低,使用Stream API编程无需多写一行多线程的代码就可以非常方便的写出高性能的并发程序。使用Stream API能够使代码更加优雅。

知唔猪的博客 1933

Android Camera驱动开发工程师面试指南:技术深度与实战准备

摘要:上海移远通信招聘Android Camera驱动开发工程师,主要负责Camera传感器驱动开发维护、高通/展锐平台底层开发及技术预研。岗位要求1年以上嵌入式开发经验,精通Camera传感器驱动调试,熟悉高通平台Camera架构及Android HAL框架。具备HAL开发、算法集成或车载/支付行业经验者优先。工作内容以Driver/HAL开发为主,需具备硬件接口评估能力。该职位接受Linux/单片机背景人员转型。

郑伟强dev的专栏 280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【java8新特性系列】 stream api

Stream API是Java 8引入的新特性,用于处理集合数据和数组的高级抽象。它提供了一种流式操作的方式,可以更简洁、高效地对数据进行处理和转换。

wang2leee的博客 111

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java8新特性之三:Stream API

https://www.cnblogs.com/wuhenzhidu/p/10740091.html

qq_33923684的博客 118

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java 8 新特性全面解析:Lambda 表达式、Stream API 等的应用

一、引言Java 8 作为 Java 语言发展历程中的重要版本,带来了诸多革命性的新特性,其中 Lambda 表达式和 Stream API 是最受关注的两大创新。这些新特性不仅借鉴了函数式编程的思想,还针对 Java 开发者在实际开发中遇到的痛点进行了优化,使得 Java 代码在保持面向对象特性的同时,具备了更加简洁、高效和灵活的表达能力。通过 Lambda 表达式,开发者可以以更简洁的方式实现函数式接口,而 Stream API 则为集合数据的处理提供了强大的工具,大大简化了数据处理逻辑。

数字魔方操控师的博客 911

Java 8常用新特性Lambda表达式与Stream API使用实例

Java8 新增了很多特性,本文主要介绍使用: Lambda 表达式 − Lambda允许把函数作为一个方法的参数。 Stream API −新添加的Stream API(java.util.stream) 函数式编程风格的引入。 更多的新特性可以参阅官网:What’s New in JDK 8 前置准备 创建一个测试类 /** * @author 码农猿 */ public class ...

程序员小强的博客 6824

java 8 stream api_JDK8新特性——Stream API

JDK8新特性——Stream API摘要:本文主要学习了JDK8的新特性中有关Stream API的使用。部分内容来自以下博客:https://blog.youkuaiyun.com/icarusliu/article/details/79495534概述Stream API(java.util.stream)把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream A...

weixin_39796533的博客 129

Java8新特性-Stream API 常用完整版

流(Stream) 1. 流的概念 2. 流的操作步骤 2.1. 创建Stream 2.1.1 通过Collection 系列集合提供的串行流:stream()、并行流: paralleStream() 2.1.2 通过Arrays中的静态方法stream(T[] array) 获取数组流 2.1.3 通过Stream类中的静态方法 of() 2.1.4 使用Stream类的静态方法 iter...

胡啊呦的博客 1万+

java8 新特性4 Stream Api-1

stream 是java8的新特性,用于操作java中list,set,map等存储结合中的元素。1.stream 自己不会存储元素2.stream不会改变源对象,相反,他们会返回一个持有结果的新stream。3.stream操作是延迟执行的,也就是说等到有结果的时候才执行。

健康平安的活着的专栏 795

Java8 新特性之 Lambda 表达式和 Stream API

Stream API 的操作中,中间操作可以有多个,但是终止操作只能有一个中间操作并不会立即执行,而是返回一个新的 Stream 流,只有在触发终止操作的时候,才会触发计算,返回流的计算结果。

2401_82656016的博客 1170

java steam reduce_Java 8新特性:Stream API与Date API

除此之外,Java8 API中包含了很多内建的函数式接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda表达式上。它还提供了很多全新的函数式接口来让工作更加方便,其中有很多是来自我们熟悉的第三方类库Guava。Steam APIStream API是Java8类库的核心,它能够应用在一组元素上一次执行的操作序列。Stream操作分为中间操作或者最终操作两种,最终...

weixin_33331559的博客 828

Java8 新特性(Lambda ,Stream API等)

1. Lambda表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期API 7. 其他特性

sinat_31089473的博客 219

java 8 新特性(二) stream API

java 8 新特性(二) stream API stram的三个操作 : 创建stram 中间操作 终止操作(终端操作) 一、创建stream的几种方式: // 第一种: 可以通过Collection 系列集合提供的 stream() 或 parallelStream() Map<String,Object> map = new HashMap<>(); employees.stream(); // 串...

码农云云的博客 207
上一篇: Java8新特性之Lambda表达式和方法引用
下一篇: Spring aop 统一异常处理和日志输出
MOKE_XR
博客等级 码龄9年 139粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值