Java8之Stream流

news2024/11/22 10:38:07

目录

简介

特点

Stream操作步骤

创建

中间操作

筛选与切片

filter(Predicate p)

distinct()

limit(long maxSize)

skip(long n)

映射

map(Function f)

flatMap(Function f)

排序

自然排序

定制排序

终止操作

匹配与查找

归约

收集

好处

不足


简介

        在编写代码的过程中,我们经常要对集合或数组数据进行操作,而有了 Stream API,我们能够非常轻松的对集合、数据进行映射、过滤、查找等操作,使得我们能够像操作数据库一样的操作集合。

        Stream 本身并不存储元素,它并不改变源数据,每次操作都会形成一个新的流,并且只有执行了Stream的终止操作,中间的过滤、查找等操作才会执行。

        集合注重存储,Stream注重计算。集合是基于内存层面的,而Stream是基于CPU的。

特点

        高效率的并行操作

        多种功能的聚合操作

        函数式编程,代码更加简洁,提高编程效率

Stream操作步骤

        只有执行了终止操作,中间操作才会执行。这也是 Stream 的延迟执行的体现

创建

1.集合创建流

	@Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("H");
        list.add("E");
        list.add("l");
        list.add("l");
        list.add("O");
        Stream<String> stream = list.stream();
    }

2.数组创建流

	@Test
    public void test() {
        Integer[] arr = {1,2,3,4,5,6,7,8,9};
        Stream<Integer> stream = Arrays.stream(arr);
    }

3.使用of方法创建流

	@Test
    public void test() {
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
    }

4.创建无限流

    @Test
    public void test() {
    	// iterator
        Stream<Integer> iterate = Stream.iterate(0, ele -> ele + 2);
        iterate.forEach(System.out::println);

    }

中间操作

筛选与切片
filter(Predicate p)

接收断言型函数式接口,对流中的元素进行过滤

distinct()

对流进行去重

limit(long maxSize)

限制流中的元素数量。可以使用 limit方法来终止无限流

skip(long n)

跳过流中的 n 个元素

映射
map(Function f)

接收一个功能型函数式接口的实现类,该函数式接口中的抽象方法会被用到流中的每一个元素上

flatMap(Function f)

flatMap 的功能和 map 类似,都是将方法应用到流中的每个元素上

排序
自然排序

Stream< T > sorted(); 使用自然排序

定制排序

Stream< T > sorted(Comparator<? super T> comparator); 使用定制排序

终止操作

匹配与查找

    @Test
    public void test() {
        List<String> stringList = Arrays.asList("hello","world","hi","word");
        boolean b = stringList.stream().allMatch(str -> str.length() > 5);
        System.out.println(b); // false
    }
归约

 reduce 会遍历流中的元素

    @Test
    public void test() {
        List<String> stringList = Arrays.asList("hello","world","hi","word");
        String reduce1 = stringList.stream().reduce("", (s1, s2) -> String.valueOf(s1.length() + s2.length()));
        System.out.println(reduce1);
        
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // Optional 是 Java8 新增的防止空指针的类,通过 get() 方法可以获取到包装的值
        Optional<Integer> reduce2 = integerList.stream().reduce((i1, i2) -> {
            return i1 + i2;
        });
        System.out.println(reduce2.get());
        // 上述代码等同于下面代码
        Optional<Integer> reduce3 = integerList.stream().reduce(Integer::sum);
        System.out.println(reduce3.get());
    }
收集

收集在开发中也是非常实用的终止操作。常常用来对流进行中间操作最后收集生成集合

Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)

好处

        1.它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。

        2.Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图这让我们使用起来方便简洁.

不足

        1.代码难以调试,因为不像for循环那样可以每一行打断点调试了

        2.在数据量不是很大的情况下,stream流是没有优势的,也就是说数据量小,且同意业务内多处使用stream处理数据,这时执行耗时比for循环更多,只有业务量达到百万级别才体现出优势。

        3.不要重复消费对象、不要修改数据源

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

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

相关文章

css基本样式的使用

1、高度和宽度 .c1{height: 300px;width: 500px; }注意事项&#xff1a; 宽度&#xff0c;支持百分比行内标签&#xff0c;默认无效块级标签&#xff0c;默认有效&#xff08;即使右侧空白&#xff0c;也不给你占用&#xff09; 块级和行内标签 css样式 标签&#xff1a; di…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼&#xff0c;每次没有清空数组导致叠加数据&#xff0c;约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

【SpringBoot】SpringBoot的创建和运行

1.什么是SpringBoot&#xff1f; Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发 的。 Spring Boot是由Pivotal团队提供的基于Spring的框架&#xff0c;该框架使用了特定的方式来进行配置&#xff0c;从而使开发…

洗鞋小程序开发

上门洗鞋小程序为用户提供了便捷、高效的鞋子洗护服务。通过手机即可预约上门取送鞋子&#xff0c;省时省力&#xff0c;让鞋子焕然一新。下面我们来看看这个小程序的具体功能介绍。 1. 预约取送服务&#xff1a;用户可以在上门洗鞋小程序中选择合适的时间和地点&#xff0c;预…

访问学者面试申请如何应对?

作为一个学者面试申请者&#xff0c;面对这一重要机会&#xff0c;我们需要认真准备并采取适当的应对策略。下面知识人网小编将提供一些建议&#xff0c;帮助你在面试中取得良好的表现。 首先&#xff0c;在准备阶段&#xff0c;你应该研究并了解申请机构的背景和研究方向。了解…

阻止冒泡 大盒子套小盒子 点击大盒子跳转页面 小盒子不跳转

比如论坛点赞功能 点击这篇帖子跳到论坛详情页面,但是点赞不跳转 <view click.stop"onSmallBoxClick"><!-- 点赞 --> </view>methods: {onSmallBoxClick() {// 点赞逻辑 } } 大盒子 帖子div <view click"g…

pdf合并一页怎么合并?这几种合并方法看看

pdf合并一页怎么合并&#xff1f;PDF文件是一种非常常见的文件格式&#xff0c;它可以在不同的操作系统和设备之间方便地进行共享。有时候&#xff0c;我们需要将多个PDF文件合并成一个文件。例如&#xff0c;当我们需要将多个文档合并成一个大文档时&#xff0c;或者我们需要将…

Redis数据类型与常用命令

文章目录 前言一、Redis数据类型1. Redis数据类型简介2. Redis数据类型特点 二、Redis常用命令1. 字符串string 操作命令2. 哈希hash 操作命令3. 列表list 操作命令4. 集合set操作命令5. 有序集合 sorted set 操作命令6. 通用命令 总结 前言 为了巩固所学的知识&#xff0c;作…

TRT3-trt-basic - 6 Int8的量化

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有&#xff1a;y kx b&#xff0c;此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有&#xff1a;y tofp32(toint8(k) * toint8(x)) b&#xff0c;其中int8 * int8结果为in…

win7,win10下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\报错

在调试虚拟网卡驱动时&#xff0c;由于修改错误&#xff0c;导致枚举顺序错乱&#xff0c;因此通过删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\Root\WINTUN下的所有项&#xff0c;即可&#xff0c;win10可用。 1、下载PStools&#xff1a; http://technet.microsoft.c…

130、仿真-基于51单片机智能窗户温湿度电机控制仿真设计(Proteus仿真+程序+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

算法(1):斐波那契数列模型

目录 &#x1f981;三步问题 &#x1f349;题目解析 &#x1f349;算法原理 &#x1f352;状态表示 &#x1f352;状态转移方程 &#x1f352;初始化 &#x1f352;填表顺序、返回值 &#x1f349;代码编写 &#x1f981;使用最小花费爬楼梯 &#x1f349;题目解析 …

为什么选择STM32才是明智之选?

在电子工程领域&#xff0c;我们强调适用性&#xff0c;性能并非最重要&#xff0c;甚至不是首要考虑因素。选择合适的微控制器&#xff08;MCU&#xff09;根据设计需求而异&#xff0c;常规做法是在保证功能满足的前提下&#xff0c;选择稳定可靠且经济实惠的器件。而对于那些…

前端转换bigInt,axios拦截器失效

前端转换bigInt&#xff0c;axios拦截器失效 关于bigInt的使用切换雪花ID解决精度丢失问题进度丢失&#xff0c;前端不支持bigInt解决问题 拦截器失效验证及解决 关于bigInt的使用 这篇文章算是使用中的小笔记吧&#xff0c;主要是我自己搜索没找到直接的方法&#x1f613;&am…

SSH隧道功能

随着互联网的普及和发展&#xff0c;越来越多的企业需要申请公网IP地址。&#xff08;公网IP地址是指可以在互联网上直接访问的P地址&#xff0c;可以用于建立网站、远程办公、视频监控等应用。&#xff09; 而公网IP费用较高&#xff0c;笔者在某搜索软件上搜了一下&#xff…

科研创新服务平台性能分析案例

前言 信息中心老师反应&#xff0c;用户反馈科研创新服务器平台有访问慢的情况&#xff0c;需要通过流量分析系统来了解系统的运行情况&#xff0c;此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原…

笑谈测试员躺着也中枪的那些事

在近9年的软件测试职业生涯中&#xff0c;多少遇到一些奇奇怪怪的事。而最悲催的莫过于那些自己躺着也中枪的事&#xff0c;如果处理不好惹火烧身&#xff0c;直接被“毙掉”也不无可能。 下面就摆摆那些事儿(其中可能因人老记忆衰退严重&#xff0c;与事实间有一定的夸大成分&…

【字节流】复制文本文件

字节流复制文本文件 1.需求&#xff1a; 把“D:\\浏览器下载\\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt” 2.分析&#xff1a; ①复制文本文件&#xff0c;其实就把文本文件的内容从一个文件中读取出来&#xff08;数据源&#xff09;&#xff0c;然后写入另一个文件…

jenkins手把手教你从入门到放弃03-安装Jenkins时web界面出现该jenkins实例似乎已离线

简介 很久没有安装jenkins了&#xff0c;因为之前用的的服务器一直正常使用&#xff0c;令人郁闷的是&#xff0c;之前用jenkins一直没出过这个问题。 令人更郁闷的是&#xff0c;我尝试了好多个历史版本和最新版本&#xff0c;甚至从之前的服务器把jenkins在跑的程序打包copy…

c++避免头文件多次包含的方法

c避免头文件多次引用的方法 方法1方法2例子头文件包含多次导致类重定义使用方法1避免重复定义使用方法2避免重复定义 方法1 把#pragma once指令放在文件的开头 方法2 用 #ifndef 条件编译指令。 #ifndef _GIRL_#define _GIRL_//代码内容。 #endif 例子 头文件包含多次导致…