java8新特性之stream

Java8 Stream详解.md 主要描述JDK8新特性Stream流的使用,有完整的笔记和配套的练习代码,Stream中的“中间操作符”,“终止操作符”都讲到了,简单易懂。有配套的笔记+代码,东西非常详细,哪怕初学者也可以看着文档做出来。 立即下载

stream是目前大部分公司在项目中使用的java8新特性的主要形式。小隐的情况也是这样。但是当你使用stream时间越长时,越发的感觉自己对stream了解的越少。所以这里仅整理个人拙见和经验。部分内容参考了《java8实战》。
《java8实战》一书对于java8新特性的讲解甚是详细,完全可以作为你学习java8的指导书籍,希望大家有时间可以完整的去学习一下这本书。

什么是流

我们都知道集合是java是用最多的API,你可以想象,你的java项目离开集合之后还能干什么。
但是java的集合操作却并不是那么美丽。当你想要对集合的数据进行处理的时候绝大多数情况下你不得不遍历整个集合,即使这个遍历的写作形式你已经习惯,包括1.5引入增强for循环,我们仍然不得不承认这种方式很别扭。我们应该知道相较与数据库而言这种差距就非常明显了。主流数据库中直接使用声明方式就能拿到你想要的数据,类似 select id from test_one; 不过这也不能怪集合,因为java的集合是数据结构,主要目的是是以特定的时间/空间复杂度存储和访问元素。而流的目的在于表达计算。
那你有没有期望过java也能直接通过显示声明非方式去获取这些数据?你可能没期望过。。。但是,如果能这样,你不相信你会上瘾么?我相信你会。
java8新引入的流就允许你以声明式的处理集合中的元素:直接说你想要干什么就行。
流的简短定义就是“从支持数据处理操作的源生成的元素序列”;

流的应用

实现了Collection接口的集合(这里这样说是因为依旧有很多人争论Map是否是集合,追根溯源Map和Collection其实都是集合),直接使用default方法.stream()或.parallelStream()方法就能获得一个Stream流对象。其中.parallelStream()获得的流会利用分支/合并框架进行并发操作,他会根据你的机器内核数自动并发处理,当然你可以通过系统属性java.util.concurrent.ForkJoinPool.common. parallelism来改变线程池大小,如下所示:
System.setProperty(“java.util.concurrent.ForkJoinPool.common.parallelism”,“12”);
流操作包括中间操作和终端操作。
返回另一个流的操作我们称为中间操作。
产生流结果的操作我们称为终端操作。
一个流操作一般包含(中间操作不是必须包含):
一个数据源(如集合)来执行一个查询;
一个中间操作链,形成一条流的流水线;
一个终端操作,执行流水线,并能生成结果。

部分常用的中间操作和终端操作
在这里插入图片描述

我使用流的时候大多是对流数据进行过滤筛选截取和映射还有最长用的遍历
下面以一个例子为示 (下列代码放在一个类中)

 /**
    * 定义要使用的类,这里为了方便使用嵌套类
    */
   private static class Phone {
       private String brand;
       private Integer price;
       private Boolean canUse;
       public String getBrand() { return brand; }
       public void setBrand(String brand) { this.brand = brand; }
       public Integer getPrice() { return price; }
       public void setPrice(Integer price) { this.price = price; }
       public Boolean getCanUse() { return canUse;}
       public void setCanUse(Boolean canUse) { this.canUse = canUse; }
   }
   @org.junit.Test
   public void test29() throws Exception {
       List<Phone> list = new ArrayList<>();
       //如有需要自己填充数据

//-------------这些中间操作返回结构都是另一个流对象,这里为了距离方便进行了统一终端操作
       //过滤出华为手机
       List<Phone> list2 = list.stream().filter(phone -> "HUAWEI".equals(phone.getBrand())).collect(Collectors.toList());
       //进行去重
       List<Phone> list3 = list2.stream().distinct().collect(Collectors.toList());
       //跳过前10部手机
       List<Phone> list4 = list3.stream().skip(10L).collect(Collectors.toList());
       //再截取跳过之后的前十部手机
       List<Phone> list5 = list4.stream().limit(10).collect(Collectors.toList());

//---------------第一种处理方式
       //取到这些手机的价格(上一篇中已经提到过当lambda只是调用了一个已经声明过的方法,为了增加可读性和进一步简化,可以使用方法引用)
       List<Integer> list6 = list5.stream().map(phone -> phone.getPrice()).collect(Collectors.toList());
       //List<Integer> list6 = list5.stream().map(Phone::getPrice).collect(Collectors.toList());
       //统计这几部手机的价格总和
       Integer sum = list6.stream().reduce(0, (a, b) -> a + b);
       //Integer sum = list6.stream().reduce(Integer::sum);
       //终端操作拼接
       //Integer sum = list.stream().filter(phone -> "HUAWEI".equals(phone.getBrand())).distinct().skip(10L).limit(10).map(phone -> phone.getPrice()).reduce(0, (a, b) -> a + b);
//--------------第二种处理方式
       //把这些手机根据是否可用分组
       Map<Boolean, List<Phone>> booleanAndPhoneList = list5.stream().collect(Collectors.groupingBy(phone -> phone.getCanUse()));
       //Map<Boolean, List<Phone>> booleanAndPhoneList = list5.stream().collect(Collectors.groupingBy(Phone::getCanUse));
       //终端操作拼接
//        Map<Boolean, List<Phone>> booleanAndPhoneList = list.stream().filter(phone -> "HUAWEI".equals(phone.getBrand())).distinct().skip(10L).limit(10).collect(Collectors.groupingBy(phone -> phone.getCanUse()));
//-------------根据价格排序并返回顺序结合
       List<Phone> list7 = list5.stream().sorted(Comparator.comparing(Phone::getPrice)).collect(Collectors.toList());
//        List<Phone> list7 = list.stream().filter(phone -> "HUAWEI".equals(phone.getBrand())).distinct().skip(10L).limit(10).sorted(Comparator.comparing(Phone::getPrice)).collect(Collectors.toList());
   }

其实这些方法会在我们慢慢的积累中变成我们的肌肉记忆,我们也会慢慢的用的越来越理所应当。
这其中的一些更细致的内容也会慢慢的掌握起来,包括流的扁平化、多级分组并行流等。
不过这其中的坎坷之路或多时候还是要自己趟一遍才能记得更深刻吧。我也开了一篇博客记录我再使用java8新特性中遇到的一些小坎坷,当你遇到问题了也可以去哪里找找有没有解决办法。

小隐小故事——玩偶和真人的区别

作为一个程序员其实我们大多数站的角度都是教官角度,而软件不外乎是对数据的操作。
当我们只有集合提供的方法时,我们的数据就像是我们的玩偶,我们对他们发号施令,但是具体操作还要我们一个个去进行。
在这里插入图片描述
我们拿到一个小兵,发现是个步兵,我们放到马路左边,我们拿到下一个小兵,发现是一个残兵,我们不忍心,就把他又放了回去,我们又去拿下一个。。。。直到我们从头拿到尾把所有的检查一个遍之后,我们知道我们已经找到了所有的身体健全的步兵。

当我们有了Stream API 我们成为了真正的指挥官。
在这里插入图片描述

我们只需下发命令,“所有的身体健全的步兵站到马路左边!”那些身体健全的步兵数据就会全部到左边。
所以你觉得我们是应该玩那些玩偶还是指挥这些真正的战士?!
拥抱Stream吧,可能你玩了很久玩偶了,而且你给这些战士下发命令的时候他们可能还有些问题,但你应该明白这是你命令的问题,因为这些战士已经被无数个优秀的指挥官打磨了万遍。年轻的指挥官,好好学习吧!

产品必备技能(十):如何绘制原型图?先要绘制页面流程图+页面原型图!附实操原型图、流程图实例(抖音) 文章目录目标题目实操步骤模板实操【抖音】APP的视频发布功能页面流程绘制页面流程图合格标准绘制页面原型图合格标准 目标 新入行的产品经理都对原型抱有向往的心境,但是有经验的产品经理不会一上来就画原型,而是先画页面流程再来画原型。通过学习,你将学会如何用页面流程图规划用户行为路径、如何借助原型识别问题、减少风险、有效沟通。 题目 任意选择一款你喜欢的产品,体验某个功能,下载并梳理此功能至少5个以上的页面流程跳转点(后面会解释),还原2 - 3个主要界面的低保真原型图。 实操步骤 可使用手绘以及Process 阅读详情

相关推荐

基于FPGA的PCIe核系列:FPGA root模式生成工程例子分析(1)

一、 PCIE系统架构 1.1 PCIE分层结构 PCIE结构 1.2 TLP包 四种TLP类型。 Memory (内存空间操作) IO (IO空间操作) Configuration (配置操作) Message (信息操作) 四种类型TLP,如果有需要响应,称为Non-Posted TLP,如果没有需要响应,称为Posted TLP。 TLP包类型 1.2.1 TLP结构 TLP数据格式 1.2.2 Header各个字段的含义 Header格式 ...

huangshanhu的博客 3433

java8新特性Stream详解

java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream。如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中。这篇文章由简入繁逐步介绍Stream。 一、Stream是什么 从名字来看,Stream就是一个流,他的主要作用就是对集合数据进行查找过滤等操作。有点类似于SQL的数据库操作。一句话来解释就是一种高效且易用的数据处理方式。大数据领...

冯冬冬的博客 823

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 283

Java StreamAPI 详解

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API(java.util.stream.*)。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执

chenshun123的博客 4915

ORB-SLAM3编程实践指南

它基于特征点的立体视觉和视觉惯性里程计技术,能够在没有先验知识的情况下,从单目、双目或RGB-D摄像头的输入中实时构建稠密三维地图,并实现相机的定位。通过正确配置环境、准备数据集和运行ORB-SLAM3,您可以实现高效的视觉SLAM系统,并获取相机在三维空间中的位姿。其中,[path_to_vocabulary]是ORB-SLAM3的词汇文件路径,[path_to_settings]是相机参数配置文件路径,[path_to_sequence]是输入图像的路径。运行ORB-SLAM3。

ByteNinja的博客 551

24、企业治理、风险与合规:精益思维的应用与实践

本文探讨了如何运用精益思维优化企业治理、风险与合规(GRC)流程,分析了职责分离与合规流程的误区,提出了预防性与检测性控制措施的合理搭配,并通过价值流映射、减少合规反馈循环等方法实现流程优化。以Etsy的PCI-DSS实施为例,展示了如何在满足法规要求的同时保持创新活力。文章还强调了构建协作型GRC文化的重要性,并展望了未来GRC的发展趋势,包括数字化转型、全球化风险管理及与可持续发展的结合。

solidity8miner的博客 103

java8新特性-Stream

流(Stream)是 Java 8 引入的一种处理集合数据的抽象概念,它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道,可以对这些元素进行筛选、转换、排序、归约等操作,实现各种数据处理需求。与传统的循环迭代方式相比,流的代码更易读、更易于并行化处理,并且能够充分发挥多核处理器的优势。通过使用流,可以提高代码的可读性和可维护性,同时也能够更高效地处理大规模数据集合。

Yaml4的博客 1961

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 376

java8新特性 stream

【代码】Java8新特性 Stream。

qq_41482600的博客 1538

北斗导航 | 2023 PTTI会议论文 2023 ITM会议论文 2022 ION GNSS+ 会议论文下载:ION 美国导航学会

2023 国际技术会议(ITM) 2023 精密时间和时间间隔系统和应用会议(PTTI) 2022 美国导航学会国际会议(ION GNSS +)

尘世冰封的专栏 4613

PCL 加权局部最优投影(WLOP)简化算法

WLOP算法是一种点云重采样方法,通过迭代优化实现点云均匀化和特征保留。算法包含数据项(加权平均位置保持几何特征)和正则化项(排斥邻近点实现均匀分布)两部分。代码实现基于PCL库,通过KD树加速邻域搜索,使用高斯权重函数计算点位置更新。参数包括输出点比例、邻域半径、正则化权重和迭代次数。该算法不依赖网格信息,适合处理大规模扫描数据的预处理优化。

点云侠的博客 630

java8 stream四大接口_【JDK8特性】Stream接口详解

一、概念普及Java8新添加了一个特性:流Stream。Stream让开发者能够以一种声明的方式处理数据源(集合、数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation)和大批量数据操作 (bulk data operation)。Stream API将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含...

weixin_33295562的博客 928

ModuleNotFoundError: No module named‘langchain.schema.output parserlangchain.schema is not a package

电脑里现有的langchain库版本与import所需的不同,卸载原有langchain,重新下载最新的langchain。在步骤1后,若仍不可运行。在确保已重新下载新langchain后,重启python后,可正常运行。在版本号中填入所需的langchain版本号,可在requirements.txt查看。运行如下代码时,出现error。

weixin_45751925的博客 1713

java8新特性stream操作

Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程...

qinqinde123的博客 572

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

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

JAVA8新特性及stream流

💐。

2301_80092713的博客 1031

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java8新特性(4)— Stream流

java8新特性(4)— Stream流 遍历集合更强大 package com.common.jdk8; import java.util.*; import java.util.stream.Collectors; //Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 //Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供...

zhangsir的博客 7786

Java8 Stream新特性详解及实战

Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了。为此,针对Java8的新特性,会更新一系列的文章,欢迎大家持续关注。 首先,我们来看一下Spring Boot源代码ConfigFileApplicationListener类中的一段代码: private...

程序新视界 8471

JAVA1.8新特性Stream流

今天我们来学习一下Java 8 的新特新—&gt;Stream流; Stream流 stream流是Java8的新特性,它也是有关于集合的新api; Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进...

Hackpatrick的博客 2082

Java 8 Stream 新特性

1)Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。(2)在我们日常使用Java的过程中,免不了要和集合打交道。对于集合的各种操作有点类似于SQL——增删改查以及聚合操作,但是其方便性却不如SQL。(3)所以有没有这样一种方式可以让我们不再使用一遍又一遍的循环去处理集合,而是能够便捷地操作集合?答案是有的,它就是——Java8引入的Stream,亦称为流。流的功能核心简单来说,流是对数据源数据源流的来源。.........

sxp知识共享 940

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

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

cooldream2009的博客 1029

jdk8新特性_Java 8 新特性之Stream流式操作

课程目标:通过本课程的学习,详细掌握Java8新特性之Stream流式操作、HashMap性能提升、新的日期处理等;适用人群:有Java基础的开发人员; 课程概述:Java 8是一个跨越式的版本,于2014年3月18日正式发布,距今几年过去了,很多企业的项目中都使用了Java8进行开发,很多开源框架也都要求至少JDK8,由于Java8中有很多重要的变化,如果不掌握Java8的这些新特性,可能我们在...

weixin_39953102的博客 241

JAVA8的新特性——Stream

Stream(流)是一个来自数据源的元素队列并支持聚合操作元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。数据源流的来源。可以是集合,数组,I/O channel, 产生器generator 等。聚合操作类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。Pipelining: 中间操作都会返回流对象本身。这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。

IT小辉同学 1030

【Java】JDK8新特性(Stream)

文章目录简介主要内容Lambda表达式Lambda表达式的简化Lambda 表达式语法类型推断函数式接口什么是函数式接口自定义函数式接口使用参数传递Lambda表达式Java内置四大核心函数式接口其它接口方法的引用与构造器引用方法引用构造器引用数组引用强大的Stream API了解Stream什么是StreamStream的操作三个步骤创建Stream由数组创建流由值创建流由函数创建流:创建无限流Stream 的中间操作筛选与切片映射排序Stream 的终止操作查找与匹配归约收集并行流与串行流了解 Fork

源僧 2274

【java8新特性】stream流

前言:在没有接触java8的时候,我们遍历一个集合都是用循环的方式,从第一条数据遍历到最后一条数据,现在思考一个问题,为什么要使用循环,因为要进行遍历,但是遍历不是唯一的方式,遍历是指每一个元素逐一进行处理(目的),而并不是从第一个到最后一个顺次处理的循环,前者是目的,后者是方式。和lambda表达式的延迟加载的原理一样,它可以进行链式编程,比如 ().filter().map().limit(),可以点下去,到最后一步必须(count或者foreach)加载数据。(对每一个元素都要进行操作)...

weixin_60017417的博客 435

Java8的新特性Stream

Spring Boot源代码ConfigFileApplicationListener类中的一段代码 private List<Profile> getOtherActiveProfiles(Set<Profile> activatedViaProperty) { return Arrays.stream(this.environment.getActiveProfiles()).map(Profile::new) .filter((profile) -> !activ

weixin_45739956的博客 207

java8新特性之Stream

stream介绍: https://blog.youkuaiyun.com/lidai352710967/article/details/82496783 Java8 Stream新特性详解及实战: https://mp.weixin.qq.com/s/WmG781nHGZdvcOYbHM2gIw https://www.cnblogs.com/xuwenjin/p/8488698.html ...

System.out.println 1652

java8新特性Stream学习

java1.8新特性之stream流式算法 JDK 1.8 新特性之Stream 详解个人笔记

weixin_42821400的博客 175
上一篇: 使用java8异常整理
下一篇: mybatis插件改进为可使用java8中的日期类型
隐者诡道
博客等级 码龄11年 13粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值