JDK都出到20多了,你还不会使用JDK8的Stream流写代码吗?

JDK8 Stream 详细使用 JDK8 管道 Stream 详细使用介绍   Stream 的获取 ① 通过集合Collection获取 List<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5)); Stream<Integer> stream = list.stream(); ② 通过数组获取 ... 阅读详情

目录

前言

Stream流 是什么?

为什么要用Steam流

常见stream流使用案例

映射 map()  & 集合 collect()

单字段映射

多字段映射

映射为其他的对象

映射为 Map

去重 distinct()

过滤 filter()

Stream流的其他方法

使用Stream流的弊端


前言

当你某天看到舍友的代码不再写for循环时,你的反应:

你还在 new Collection<>() ,写着for循环的时候,舍友已经开始偷偷卷你,更改代码风格了

本文将带着大家简单理解 Stream 流,并通过部分案例描述 Stream 流 的实用方法

Stream流 是什么?

Stream 流是 Java 8 引入的一个强大工具,它提供了一种全新的方式来处理集合和数组等数据源,使得数据处理变得更加简单、高效和易于理解。


通俗的理解起来就是提供了一种更加便利的遍历处理方式。


如果你要问我 Stream流用起来什么感觉?

那我只能说,,这种感觉就像飞翔在~~

噢不对,,感觉就是:

为什么要用Steam流

 Stream 流的主要用途是提供一种高效且表达力高的方式来处理集合和数组等数据源。通过使用 Stream 流,可以避免显式的迭代器和循环,使得代码更加简洁、易读。Stream 流支持复杂的查询/过滤、映射/转换、归约/汇总等操作,能够极大地简化数据处理的复杂度。

总结起来还是:简洁、易读

当然,这也让你的代码看起来更高级那么一点点~~

如下案例,拿到所有的评论的id 集合的两种方法。

  • 第一种-for循环便利获取
		List<Comment> list = commentMapper.selectList(wrapper);
		List<Integer> commentId = new ArrayList<>();
		for(Comment c : list){
			commentId.add(c.getId());
		}
  • 第二种-Stream流获取
		List<Comment> list = commentMapper.selectList(wrapper);
		List<Integer> commentId = list.stream().map(Comment::getId).collect(Collectors.toList());

两种方法的区别显而易见

下面介绍stream流比较实用的方法

常见stream流使用案例

在这里我们准备一个简单的对象来进行案例测试,只约定两个字段。

@Data
@AllArgsConstructor
public class StreamTestObject {

    Integer id1;

    Integer id2;

}

映射 map()  & 集合 collect()

map() 方法是最常用的方法之一,它可以将流中的每个元素转换成另一种形式,返回转换后的 Stream。

如前文的例子所示,

单字段映射
        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(5, 6));
        // 便于观察变化
        Stream<StreamTestObject> stream = streamTestObjects.stream();
        Stream<Integer> id1Stream = streamTestObjects.stream().map(StreamTestObject::getId1);

看代码我们可以看到,map方法将对象的stream流映射为了其中  id1 这个字段的stream流


拿到这个字段的流后,可以做些什么呢?

最常用的方法之一就是与 集合 collect() 搭配起来使用。

那么 collect() 方法能做写什么呢?

  • 用途:将流中的元素累积成一个汇总结果,我们可以按照自己的需求将结果汇总为一个 List、Set、Map 等

如下代码所示

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(5, 6));
        Stream<StreamTestObject> stream = streamTestObjects.stream();
        Stream<Integer> id1Stream = streamTestObjects.stream().map(StreamTestObject::getId1);

        List<Integer> collectList = id1Stream.collect(Collectors.toList());
//        Set<Integer> collectSet = id1Stream.collect(Collectors.toSet());

        // 连起来使用一行代码可以写成这样
        collectList = streamTestObjects.stream().map(StreamTestObject::getId1).collect(Collectors.toList());
//        collectSet = streamTestObjects.stream().map(StreamTestObject::getId1).collect(Collectors.toSet());
        System.out.println("collectList:" + collectList);
// 输出结果 collectList:[1, 3, 5]

结果能够把 id1 成功收集起来,代码的易读性也体现在其中。我们一眼就能看出这行代码映射了id1 这个字段为一个 List 或 Set。

多字段映射

那如果我们想要对象集合中的 id1 和 id2 都汇总到一个 List<Integer> 集合里,应该如何操作呢。

这里我们可以使用一个 flatMap() 方法

  • 用途:将流中的每个元素都转换成另一个流,然后将所有流连接成一个流。

直接上代码

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(5, 6));
        List<Integer> collectList = streamTestObjects.stream()
                .flatMap(object ->Stream.of(object.getId1(), object.getId2())).collect(Collectors.toList());
        System.out.println("collectList:" + collectList);
        //输出结果 collectList:[1, 2, 3, 4, 5, 6]

在这个例子中,Stream.of(obj.getId1(), obj.getId2())为每个对象生成了一个包含两个ID的流,它在map中 形成了一个临时的流

然后flatMap将这些流“展平”成了一个包含所有ID的流,最后我们通过collect(Collectors.toList())将这个流收集到了一个列表中。

映射为其他的对象

有的时候的业务需求需要我们把一个对象集合转化为另外一个集合对象,如果是单纯的 字段copy,我们可以使用 BeanUtils 或者 MapStruct 等方法实现。

如果转化的过程中设计业务逻辑,那么就需要 Stream流出手了。

这里需要设计到一个显示 return 的写法,上代码,先准备一个另外的对象,只包含一个id字段

@Data
@NoArgsConstructor
@AllArgsConstructor
public class StreamOtherObject {

    Integer id;
    
}

然后 我们将上述测试对象的id1,转化为这里的id字段。

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(4, 5));
        List<StreamOtherObject> collectList = streamTestObjects.stream()
                .map(streamTestObject -> {
                    StreamOtherObject object = new StreamOtherObject();
                    object.setId(streamTestObject.getId1());
                    return object;
                }).collect(Collectors.toList());
        System.out.println("collectList:" + collectList);
        //输出结果 collectList:[StreamOtherObject(id=1), StreamOtherObject(id=3), StreamOtherObject(id=4)]

注意看返回的集合对象已经是我在表达式里return 的 StreamOtherObject了。

也就是 return 的内容就是集合的具体对象

映射为 Map

Stream流还能把集合映射为一个Map,这里我们测试用例为将映射结果设置为 key 为 id1, value 为对象本身

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4));
        Map<Integer, StreamTestObject> map = streamTestObjects.stream()
                .collect(Collectors.toMap(
                        StreamTestObject::getId1,
                        Function.identity(),
                        (existsOne, replaceOne) -> replaceOne));
        System.out.println("collectMap:" + map);
        //输出结果 collectMap:{1=StreamTestObject(id1=1, id2=2), 3=StreamTestObject(id1=3, id2=4)}

可以看到,toMap() 方法中,传递了3个参数,前两个分别为 key , value

第三个参数传了一个表达式,这里的逻辑表示如果发生冲突,就保留 Map中新的那个对象,而不是保留它。同时,第三个参数也处理了冲突,如果你没有对于 key 相同的情况做处理,也就是 key 冲突了,方法将抛出一个IllegalStateException。

所以你需要做对应的处理,如try catch 下来,或者进行冲突处理,即传递第三个参数。

去重 distinct()

对于拿到的流结果,我们有的时候有去重的需求,当然我们可以转为 toSet() 进行去重

stream流同样提供了一个方法进行去重,就是 distinct() 方法

  • 用途:去除流中的重复元素,返回包含不同元素的 Stream。

这里比较好理解,我们直接看案例

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(4, 5));
        List<Integer> collectList = streamTestObjects.stream()
                .flatMap(object ->Stream.of(object.getId1(), object.getId2())).distinct().collect(Collectors.toList());
        System.out.println("collectList:" + collectList);
        //输出结果 collectList:[1, 2, 3, 4, 5]

过滤 filter()
  • 用途:根据提供的条件过滤元素,返回满足条件的 Stream。

过滤的方法也是比较常用的方法,也是比较多业务中有这个需求的。这里介绍两种方法

在拿到一个流后,也许不是所有的元素我们都需要。我们需要保存满足特定条件的元素,这时候就可以使用 filter方法来实现。

这里的案例表示筛选除 id1 为 1,id2 为 4 的数据,代码如下:

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(4, 5));
        List<StreamTestObject> collectList = streamTestObjects.stream()
                .filter(object -> object.getId1().equals(1) || object.getId2().equals(4))
                .collect(Collectors.toList());
        System.out.println("collectList:" + collectList);
        //输出结果 collectList:[StreamTestObject(id1=1, id2=2), StreamTestObject(id1=3, id2=4)]

如果你的过滤逻辑比较复杂可以使用显示 return 写法来过滤

        List<StreamTestObject> streamTestObjects = Arrays.asList(
                new StreamTestObject(1, 2),
                new StreamTestObject(3, 4),
                new StreamTestObject(4, 5));
        List<StreamTestObject> collectList = streamTestObjects.stream()
                .filter(object -> {
                    int id1 = 1;
                    int id2 = 4;
                    return object.getId1().equals(id1) || object.getId2().equals(id2);
                }).collect(Collectors.toList());
        System.out.println("collectList:" + collectList);
        //输出结果 collectList:[StreamTestObject(id1=1, id2=2), StreamTestObject(id1=3, id2=4)]

在代码块里可以编辑自己自定义的过滤逻辑

这里要注意返回值是一个布尔值,如果为 true,则保留这项数据,不满足,则进行一项数据处理。

Stream流的其他方法

前文是 Stream 流比较常见的方法案例,它还提供了很多其他的接口来实现对应的场景,如:

  1. sorted()
    • 用途:对流中的元素进行自然排序(需实现 Comparable 接口),返回排序后的 Stream。
    • 示例:对用户列表按年龄进行排序。
  2. limit(long maxSize)
    • 用途:截断流,使其包含不超过给定数量的元素,返回截断后的 Stream。
    • 示例:只取用户列表中的前三个用户。
  3. skip(long n)
    • 用途:跳过流中的前 n 个元素,返回剩下的元素的 Stream。
    • 示例:跳过用户列表中的前两个用户,取后面的用户。
  4. forEach(Consumer<? super T> action)
    • 用途:这是大家比较熟悉的操作,在代码编写中可以省去 .Stream() 的写法。意为对流中的每个元素执行提供的操作,这是一个终结操作。
    • 示例:遍历用户列表并打印每个用户的名字。

使用Stream流的弊端

学习了Stream流 的优点之后,也需要知道随之产生的弊端有短些,这里我列举几个主要的内容

  • 性能问题:
  1. 多次遍历:有时为了完成一个操作,可能需要多次遍历数据源。例如,先过滤(filter)再映射(map)最后收集(collect),这会导致数据被多次遍历。
  2. 并行流开销:虽然并行流可以加速处理过程,但它们引入了额外的线程管理开销,并且不总是能带来性能提升,尤其是在数据源较小或操作相对简单时。
  3. 懒加载导致的意外行为:Stream操作是懒加载的,这意味着它们直到需要结果时才会执行。这可能导致在调试时难以追踪问题的源头,或者在某些情况下,当流操作依赖于外部状态时,可能导致不可预测的行为。

  • 可读性和维护性:

??:前面不是可读性强吗,怎么有问题了?如果嵌套太多层的操作方法,也会使得表达式的可读性降低

  1. 复杂逻辑难以追踪:对于包含多个复杂操作(如多重过滤、映射、归约等)的Stream链,其逻辑可能变得难以理解和追踪。
  2. 调试困难:由于Stream操作的延迟执行和中间操作的无状态性,调试Stream代码可能会比传统循环更加困难。

  • 错误处理:
  1. 异常处理复杂:在Stream操作中处理异常(如尝试映射一个可能抛出异常的函数)比在传统循环中更复杂。Stream API没有直接支持异常处理机制,通常需要通过try-catch块或自定义函数来处理。

  • 内存消耗:
  1. 中间结果存储:Stream API在执行过程中可能会创建中间结果的临时集合,尤其是在进行复杂操作时,这可能会增加内存消耗。

到这里,同学们可以多实操一下这些方法来巩固知识。文章如有遗漏或建议更改的部分欢迎佬们指出。

JDK8新特性之Stream流02 首先,java.util.Collection接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流。所有的Collection集合都可以通过stram默认方法获取流。java.util.stream.Stream 是JDK 8新加入的流接口。1.通过Collection接口中的默认方法Stream stream()Stream接口的静态方法of可以获取相对应的流。方式2:Stream中的静态方法of获取流。掌握Stream中的静态方法of获取流。 阅读详情

相关推荐

JDK8中使用流Stream流把List转换成int数组

JDK8中使用流Stream流把List转换成int数组

TrueDei 4727

JDK8新特性

JDK8是Java升级变化最大的一个版本,JDK8引入很多新的写法,比如函数式接口、Lambda表达式、Stream函数式操作流元素集合、接口的默认方法、接口的静态方法等。JDK8是Java升级变化最大的一个版本,JDK8引入很多新的写法,比如函数式接口、Lambda表达式、Stream函数式操作流元素集合、接口的默认方法、接口的静态方法等。

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 408

Java JDK8新特性:Stream流

Java JDK8新特性:Stream的使用

weixin_62307109的博客 245

KVNAND架构:解决边缘设备部署LLM的内存与带宽挑战

大语言模型(LLM)在边缘设备部署时面临内存容量和带宽限制的核心挑战。传统方案依赖DRAM存储KV缓存,导致高昂成本和性能瓶颈。闪存计算(IFC)通过计算单元下沉和流水线优化缓解部分问题,但仍受限于DRAM依赖。KVNAND架构创新性地将KV缓存直接存储在3D NAND闪存中,结合异构计算和页面级KV映射技术,显著降低延迟和能耗。该架构特别适用于长上下文场景,如文档分析和个人助理应用,能有效解决内存溢出(OOM)问题并提升计算单元利用率。关键技术包括头组并行(HG)执行和混合键合设计,为边缘AI部署提供了新

weixin_27215337的博客 320

【实战指南】OpenClaw Telegram 群聊不响应完整解决方案:从获取群 ID 到关闭隐私模式全流程

将整个从“获取群组 ID → 配置 OpenClaw Telegram 通道 → 关闭隐私模式 → 测试”的全流程都整合进去。

hampeter的博客 3485

Java—JDK8新特性—Steam流

在JDK 8中提供了Stream API,把真正的函数式编程风格引入到Java中,它可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。Stream是JDK 8中处理集合的关键抽象概念,它可以指定你希望对进行的操作,可以执非常复杂查找、过滤和映射数据等。使用Stream APl对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简而言之,StreamAPI提供了一种高效且易于使用的处理数据的方式。

Acloasia的博客 2223

若依框架-实现管理端与用户端的不同页面布局

我们现在要做的是:管理员登录时展示后台管理端,普通用户登录时展示我们自己写的页面。所以我们可以用v-if来判断登录用户的角色,如果用户角色包含admin,说明是管理员,渲染管理端相关组件,否则渲染用户端组件。不过若依作者的本意还是想退出系统后清空角色信息,所以为了保险期间,我们可以在退出系统后,延迟2秒,再单独清空角色信息。当我们登录管理端后,再退出登录,会有那么一瞬间渲染用户页面,然后才是回到登录界面。这个时候,前端检测到角色信息为空,不包含admin,于是就会渲染用户页面。用来延迟 2 秒执行。

m0_74462339的博客 1564

jdk8新特性(Lambda、Steam、函数式接口)

Java 8 (又称为jdk 1.8)是Java语言开发的一一个主要版本。Java 8是oracle公司于2014年3月发布,可以看成是自Java5以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。:速度更快代码更少(增加了新的语法: Lambda 表达式)强大的Stream API便于并行最大化减少空指针异常: OptionalNashorn引擎,允许在JVM.上运行JS应用。

YZG ' BLOG 582

从CAD图纸到GIS地图:手把手教你用Global Mapper处理DWG文件(含坐标配准)

本文详细介绍了如何使用Global Mapper将CAD图纸(DWG文件)转换为GIS地图,包括坐标配准、图层与属性转换等关键步骤。通过四参数变换和控制点匹配技术,确保数据精准转换,适用于测绘、城市规划等领域。文章还提供了高级处理技巧和质量控制流程,帮助用户高效完成GIS化工作。

weixin_29196891的博客 520

微信小程序开发:实现地图导航功能

其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。

吃不胖. 8917

JDK8新特性-Stream流

JDK8新特性-Stream流,本教程附有非常多的例子,看完肯定能懂Stream流!

Yyyy的博客 4211

Gromacs 模拟昆虫 P450 解毒酶与农药结合完整指南,仅供参考!

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1238

深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘

在这篇文章中,我们将深入探讨 Java JDK 1.8 中 Stream 流的源码实现,揭开数据流背后的奥秘。我们将详细分析中间操作(如过滤、映射、排序、去重等)和终端操作(如收集、匹配、计数、归约等)的具体实现细节,探讨并行流处理机制以及流的性能优化策略,深入了解流是如何内部组织和处理数据的。此外,我们还将探讨流中的异常处理机制,以及流与迭代器之间的关系,带领读者一同揭示 Java Stream 流在 JDK 1.8 中的实现原理和运行机制。

忆~遂愿的博客 8500

Openclaw错误分析与解决方案之:Agent couldn’t generate a response.

Openclaw错误分析与解决方案之:Agent couldn't generate a response. Note: some tool actions may have already been executed — please verify before retrying.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1315

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JDK8新特性(三):集合之 Stream 流式操作

1.Stream流由来 首先我们应该知道:Stream流的出现,主要是用在集合的操作上。在我们日常的工作中,经常需要对集合中的元素进行相关操作。诸如:增加、删除、获取元素、遍历。 最典型的就是集合遍历了。接下来我们先举个例子来看看 JDK8 Stream流式操作出现之前,我们对集合操作的过程,从中来了解一下JDK8 之前集合操作数据的弊端。 Demo...

扛麻袋的少年的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JDK8新特性--Stream流详解

覆盖了Java 8中Stream流的基本概念、操作方法及其在并行处理中的应用. Stream流不同于传统的IO流,它是一种用于对数据进行加工处理的抽象概念,类似于工厂的生产流水线。通过介绍了获取Stream流的几种方式,包括从集合和数组获取流的方法。同时详细描述了Stream流的常用操作方法,如filter、map、sorted、distinct等,以及如何使用终结方法和非终结方法对流进行处理。此外,文中还涉及了如何收集Stream流中的结果到集合或数组中,以及并行Stream流的使用和效率对比

2401_85014515的博客 2408

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JDK8---Stream流详解

Stream流详解

m0_74105656的博客 1839

JAVA中JDK8新特性(Stream流)

JDK8以后才有的一个新特性,是专业用于对集合或者数组进行便捷操作的。有多方便呢?我们用一个案例体验一下,然后再详细学习。有一个List集合,元素有"张三丰","张无忌","周芷若","赵敏","张强",找出姓张,且是3个字的名字,存入到一个新集合中去。Collections.addAll(names, "张三丰","张无忌","周芷若","赵敏","张强");用传统方式来做,代码是这样的// 找出姓张,且是3个字的名字,存入到一个新集合中去。

2401_83377623的博客 1429

jdk1.8中使用Stream流

什么是Stream流 这里说明一下,Stream流不像传统的java.io中的inputStream和outputStream流,在jdk8中Stream是对集合Connection的增强,Stream比传统的流更加的精炼,语法更加的简洁。 我们为什么使用Stream流 Stream流大大减少对io的频繁操作,并且有着非常不错的性能,连亚马逊对大量数据的分析也是用的Stream流,只需要写少量的代...

技术无止境 5496

JDK8新特性之Stream流详解

JDK8新特性之Stream流式操作1 流概述 1 流概述   流是 JDK8 新增的成员,允许以声明性方式处理数据集合,可以把 Stream 流看作是遍历数据集合的一个高级迭代器   使用流的好处: 代码以声明性方式书写:说明想要完成什么,而不是说明如何完 成一个操作 可以把几个基础操作连接起来,来表达复杂的数据处理的流水 线,同时保持代码清晰可读   流是什么?   从支持数据处理操作的源生成...

ChengZi~ 2528

JDK1.8新特性之Stream流

目录 Stream流 传统办法对集合中的数据进行过滤 使用Stream对集合中的数据进行过滤 Stream流的思想 Stream流 之前我们学过I/O流,但实际上,谁规定流就一定是I/O流呢?Stream流用于解决已有集合类库的弊端。例如for循环的语法是怎么做,for循环的循环体是做什么。我们应该更加关注的是做什么,而不是怎么做。 传统办法对集合...

我能在河边钓一整天的鱼 2905

JDK8新特性关于Stream流的作用以及使用

JDK8新特性关于Stream流的作用以及使用 部分内容参考自:http://www.runoob.com/java/java8-streams.html Stream API是JDK8新添加的处理集合的关键组件,提供了多种的函数式操作。 ...

weixin_44553436的博客 6854

JDK8新特性stream流

Stream将要处理的集合或者数组看作一种流,在流中,通过Stream API对流中的元素进行操作,比如:过滤、筛选、排序、聚合、循环、分页等。

chat_bot的博客 6533

JDK8新特性(一)集合之 Stream 流式操作

首先我们应该知道:Stream流的出现,主要是用在集合的操作上。在我们日常的工作中,经常需要对集合中的元素进行相关操作。诸如:增加、删除、获取元素、遍历。最典型的就是集合遍历了。接下来我们先举个例子来看看 JDK8 Stream流式操作出现之前,我们对集合操作的过程,从中来了解一下 JDK8 之前集合操作数据的弊端。Demo:现在有一个List集合,集合中有如下数据:"张无忌"、"周芷若"、"杨逍"、"张强"、"张三丰"、"赵敏"

weixin_58216062的博客 2749
上一篇: Java后端校招生需要懂前端吗?来听听应届生的分享
durancer
博客等级 码龄6年 5130粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

durancer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值