Java8-Stream的中间操作

Java8 Stream源码精讲:中间操作原理详解 通过分析创建Stream的过程,详细介绍了Spliterator接口定义,Spliterator子类的实现细节,Spliterator在Stream中的调用时机,以及代表源阶段Stream的Head类结构。本章将继续带着大家深入理解什么是Stream中间操作,进入每一个中间操作的源码了解我们定义的lambda表达式是如何在流上处理数据的。 中间操作 Stream是惰性流,中间操作只是将lambda表达式记录下来,返回一个新的Stream,只有终止操作被调用时,才会触发计算。这样可以保证数据被尽量少的遍历 阅读详情

 

 

 

 

package csdn.day0216;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * 测试Stream的中间操作
 *
 */
public class StreamAPITest1 {

    //1-筛选与切片
    @Test
    public void test1(){
        List<Employee> list = EmployeeData.getEmployees();
//        filter(Predicate p)——接收 Lambda , 从流中排除某些元素。
        Stream<Employee> stream = list.stream();
        //练习:查询员工表中薪资大于7000的员工信息
        stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);

        System.out.println();
//        limit(n)——截断流,使其元素不超过给定数量。
        list.stream().limit(3).forEach(System.out::println);
        System.out.println();

//        skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
        list.stream().skip(3).forEach(System.out::println);

        System.out.println();
//        distinct()——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

        list.add(new Employee(1010,"刘强东",40,8000));
        list.add(new Employee(1010,"刘强东",41,8000));
        list.add(new Employee(1010,"刘强东",40,8000));
        list.add(new Employee(1010,"刘强东",40,8000));
        list.add(new Employee(1010,"刘强东",40,8000));

//        System.out.println(list);

        list.stream().distinct().forEach(System.out::println);
    }

    //映射
    @Test
    public void test2(){
//        map(Function f)——接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素。
        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);

//        练习1:获取员工姓名长度大于3的员工的姓名。
        List<Employee> employees = EmployeeData.getEmployees();
        Stream<String> namesStream = employees.stream().map(Employee::getName);
        namesStream.filter(name -> name.length() > 3).forEach(System.out::println);
        System.out.println();
        //练习2:
        Stream<Stream<Character>> streamStream = list.stream().map(StreamAPITest1::fromStringToStream);
        streamStream.forEach(s ->{
            s.forEach(System.out::println);
        });
        System.out.println();
//        flatMap(Function f)——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
        Stream<Character> characterStream = list.stream().flatMap(StreamAPITest1::fromStringToStream);
        characterStream.forEach(System.out::println);

    }

    //将字符串中的多个字符构成的集合转换为对应的Stream的实例
    public static Stream<Character> fromStringToStream(String str){//aa
        ArrayList<Character> list = new ArrayList<>();
        for(Character c : str.toCharArray()){
            list.add(c);
        }
       return list.stream();

    }



    @Test
    public void test3(){
        ArrayList list1 = new ArrayList();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        ArrayList list2 = new ArrayList();
        list2.add(4);
        list2.add(5);
        list2.add(6);

//        list1.add(list2);
        list1.addAll(list2);
        System.out.println(list1);

    }

    //3-排序
    @Test
    public void test4(){
//        sorted()——自然排序
        List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);
        list.stream().sorted().forEach(System.out::println);
        //抛异常,原因:Employee没有实现Comparable接口
//        List<Employee> employees = EmployeeData.getEmployees();
//        employees.stream().sorted().forEach(System.out::println);


//        sorted(Comparator com)——定制排序

        List<Employee> employees = EmployeeData.getEmployees();
        employees.stream().sorted( (e1,e2) -> {

           int ageValue = Integer.compare(e1.getAge(),e2.getAge());
           if(ageValue != 0){
               return ageValue;
           }else{
               //按照薪水从小到大
               return Double.compare(e1.getSalary(),e2.getSalary());
               //按照薪水从大到小
               //return -Double.compare(e1.getSalary(),e2.getSalary());
           }

        }).forEach(System.out::println);
    }

}

拓展:

employees.stream().sorted( (e1,e2) -> {
            //方法1:
            /*int ageValue = Integer.compare(e1.getAge(),e2.getAge());
            if(ageValue != 0){
                return ageValue;
            }else{
                //按照薪水从小到大
                return Double.compare(e1.getSalary(),e2.getSalary());
                //按照薪水从大到小
                //return -Double.compare(e1.getSalary(),e2.getSalary());
            }*/

            //方法2:用大于>,小于<
            /*if(e1.getAge() > e2.getAge()){
                return 1;
            }else if(e1.getAge() < e2.getAge()){
                return -1;
            }else{//按照薪水从小到大
                return Double.compare(e1.getSalary(),e2.getSalary());
            }*/

            //方法3:
            //等效代码
            if(String.valueOf(e1.getAge()).equals(String.valueOf(e2.getAge()))){
                return Double.compare(e1.getSalary(),e2.getSalary());
            }else{
                //return Integer.compare(e1.getAge(),e2.getAge());
                //或者用compareTo,点进去看源码,也就是调用上面的Integer.compare
                /*public int compareTo(Integer anotherInteger) {
                    return compare(this.value, anotherInteger.value);
                }
                public static int compare(int x, int y) {
                    return (x < y) ? -1 : ((x == y) ? 0 : 1);
                }*/
                return  Integer.valueOf(e1.getAge()).compareTo(Integer.valueOf(e2.getAge()));
            }

        }).forEach(System.out::println);

Java8 新特性之Stream(二)-- Stream的中间操作 Java8 新特性之Stream(二)-- Stream的中间操作。 阅读详情

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 809

Stream流的中间操作:筛选与切片、映射、排序

Stream流的中间操作:筛选与切片、映射、排序 package com.xiaobu.lambda.java3; import com.xiaobu.lambda.java2.Employee; import com.xiaobu.lambda.java2.EmployeeData; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java

小布のJava世界 292

11-4 AEB 算法原理及系统组成

本专题旨在探讨如何利用仿真软件开发自动紧急制动系统AEB,主要通过整理开发流程,实现从需求到验证的全流程掌握,为后续开发提供支持;同时,研究了如何在汽车自动驾驶仿真工具中开发自己的算法,并解决了从ISO、E-CNAP、GB/T以及交通法规等提炼出功能需求的问题,以快速实现原型模型的开发。本专题重点讲解了AEB的工作原理、系统/软件架构和需求、算法模型及实现、CCRs/CCRb/CCRm建模与仿真、VRU-AEB-B/P/M建模与仿真,同时还提供了测试用例,期待将AEB算法成功地产品化。

AIgraphX 8556

java8 StreamAPI(二) 中间操作

一、中间操作列举 过滤 filter 去重 distinct 排序 sorted 截取 limit 跳跃 skip 转换map/flatMap 其他 peek 二、例子演示 2-1 过滤 filter (获取1~5之间的偶数) Arrays.asList(1, 2, 3, 4, 5).stream().filter(x-&amp;gt;x%2==0...

恶心的小达达 471

AS5600磁编码器选型与安装避坑指南:磁铁形状、间隙距离到底怎么选?(附实测数据)

本文详细解析了AS5600磁编码器的选型与安装要点,包括磁铁形状、间隙距离等关键参数的选择,并附有实测数据支持。特别针对Arduino和I2C接口的应用场景,提供了硬件选型和机械安装的实用指南,帮助开发者避免常见陷阱,提升系统精度和稳定性。

weixin_27038245的博客 290

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说,需要根据实际场景和使用的需要,使用不同厂家,不同型号的DDR,虽然原理上大同小异,但是还是有一些细节上的需要注意的地方,接触一个新的DDR芯片,首先就是需要找到对应的datasheet,而能都读懂datasheet,也是一个硬件工程师的必备技能。

apple_53311083的博客 5223

java中Stream流操作学习笔记

主要是对视频中的知识点进行一个总结stream流是java8发布针对集合操作的新特性 ,可作为对数据筛选的一种方法。

m0_52458424的博客 4515

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

java8中stream流集合的筛选,规约,分组,聚合

简要介绍一下streamStream 将要处理的元素集合看作一种流,在流过程中,借助stream api对流中的元素进行操作,比如筛选,排序,聚合等。

极客鼠之家 4697

(第七章)FAST开发方法

摘要: FAST是一种轻量级、业务驱动的系统分析与开发框架,适用于中小型项目,强调快速交付和组件化开发。其核心包括8个阶段:范围定义、问题分析、需求分析、逻辑设计、决策分析、物理设计、构造测试和安装发布。特点为结构化、用户参与、迭代渐进,适合需求明确且需快速交付的项目。与RUP(重量级)、敏捷(极轻量)相比,FAST更侧重业务分析和模块化开发。软考中可通过口诀“范围问题求逻辑,决策物理构发布”记忆阶段,并掌握五大开发方法(瀑布、原型、FAST、RUP、敏捷)的核心区别及适用场景。

echo的博客 917

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

Java8 stream流操作: 去重,排序,筛选,分组,聚合计算

java 8 stream流操作List,Map

qq_41902662的博客 1万+

SMOKE 3D:从 Python 到 C++ 实现车辆与行人单目 3D 视觉识别在 RK3588 上的深度部署

SMOKE的网络结构通常基于高性能的骨干网络(如DLA-34,您使用的模型就是基于此),通过编码器-解码器架构来提取特征。输入:RGB图像(本项目为骨干网络:用于特征提取。检测头热力图分支:预测关键点热力图。通常在热力图上进行NMS来找到局部最大值,即潜在的关键点位置。回归分支:对于每个关键点位置,预测上述的8维3D属性向量。分类分支:预测每个关键点对应的物体类别。置信度分支:预测每个关键点的置信度。本教程详细介绍了SMOKE单目3D目标检测模型在RK3588上的部署。我们从SMOKE的。

LXY_LOVE36的博客 439

Java8 Stream Step2 中间操作

package com.xbb.java.stream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; /** * 筛选和过滤 * 1 : filter --接收Lambda.从流中排除某些元素. * 2 : limit...

靳江海 291

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java8 stream 教程_Java8 Stream中间操作实例解析

这篇文章主要介绍了Java8 Stream中间操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下介绍StreamStream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要...

weixin_32287387的博客 338

WINCC7.3破解文件

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

Java 8 Stream中间操作(方法)示例

Java 8 Streams中间操作的完整指南。 所有内置Stream API中间操作(方法)的列表以及示例。 1.概述 在本教程中,我们将学习什么是 Java 8 Stream 中的中间操作 。 所有这些操作都在java.util.stream.Stream包中 。 在上一教程中,我们讨论了Java 8 Stream API和Lambda Expressions 。 规则: J...

最佳 Java 编程 2071

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java8中创建Stream 流的四种方式以及 Stream 中间操作

Stream api **Stream api 是java8 中提供的对集合处理的api , 对数据进行一系列的中间操作,元数据不会发生改变 集合讲的是数据, 流 讲的是计算(用于操作数据源,集合,数组)所生成的元素序列。** Stream API位于 java.util.stream.* 包下。 1 Stream 自己不...

. 4420

java8新特性之Stream 中间操作的多种方式

1、概述 多个中间操作可以连接起来形成一个流水线,除非触发终止操作,否则中间操作不会执行任何的处理!而在触发终止操作时一次性全部处理,称为“惰性求值” 。 2、中间操作分类 筛选与切片 方法 简述 filter(Predicate p) 接收 Lambda , 从流中排除某些元素。 distinct() 筛选,通过流所生成元素的 hashCode() 和 equals(...

战丶后风!!的博客 1094

java8 stream_Java 8 Stream中间操作(方法)示例

java8 stream Java 8 Streams中间操作的完整指南。 带有示例的所有内置Stream API中间操作(方法)列表。 1.概述 在本教程中,我们将学习什么是Java 8 Stream中的中间操作。 所有这些操作都在java.util.stream.Stream包中。 在上一教程中,我们讨论了Java 8 Stream API和Lambda Expressions 。 规则:...

cunfen3485的博客 379

JAVA8 stream接口 中间操作和终端操作

上一篇我们介绍了stream的集中创建方式,《 java8 Stream-创建流的几种方式》,从这篇开始,我们开始介绍stream接口里的一系列方法的作用,以及使用,每个方法都会有相对应的案例的解析,让大家可以更加直观的方式,了解方法的使用,使用这些方法之前,我们先对方法的类型,进行归类,然后分类型进行讲解;下面,我们再看下接口定义 public interface Stream<T&g...

鸭鸭的博客 2万+

java8——学习Stream流(二):流的中间操作

在上一篇讲到java8中什么是Stream流和Stream流有什么用:java8——学习Stream流(一):创建Stream流,这里我们会讲到创建流之后,我们可以对其创建的流进行的中间操作,多个中间操作可以连接起来形成一个流水线,除非流水线上触发了终端操作,否则中间操作并不会执行任何的处理!而是在终端操作时一次性全部处理,我们称之为“惰性求值”。 中间操作:1.筛选和切片 我们先创建一个实体类``:Enployee 类 public class Enployee { private Inte.

qq_45979629的博客 651

java8stream中间操作,【Java8新特性】Stream API有哪些中间操作?看完你也可以吊打面试官!!...

写在前面在上一篇《【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?》中,一名读者去面试被面试官暴虐!归根结底,那哥儿们还是对Java8的新特性不是很了解呀!那么,我们继续讲述Java8的新特性,旨在最终可以让每位读者在跳槽面试的过程中吊打面试官!!Stream的中间操作多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在...

weixin_34110970的博客 242

java+stream+源码分析_Java8 Stream中间操作实例解析

这篇文章主要介绍了Java8 Stream中间操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下介绍StreamStream 使用一种类似用于SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要...

weixin_33034073的博客 168

Java8 Stream源码精讲(三):中间操作原理详解

.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .ma...

程序员小明1024 1028
上一篇: Java8-强大的Stream API
下一篇: win7-休眠按钮设置
ZHOU_VIP
博客等级 码龄11年 1万+粉丝 1779原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ZHOU_VIP

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

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

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

打赏作者

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

抵扣说明:

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

余额充值