当前位置:

首页 > 编程开发 > Java8新特性Stream流使用方法?

Java8新特性Stream流使用方法?

Stream流的概念为什么要使用Stream流?Stream流的思想类似于一个生产车间的流水线。当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步驱方案,然后再按照方案去执行它。Stream(流)是一个来自数据源的元素队列元素是特定类型的对象,形成一个队列。lava中的Stream并不会存储元素,而是按需计算。数据源流的来源。可以是集合,数组等。Stream的两个基础的特征:·Pipelining:中间操作都会饭回流对象本身。这样多个操作可以事联成一个管道

本文目录

    Java8新特性Stream流使用方法?

    Stream流的概念

    为什么要使用Stream流?

    Java8新特性Stream流使用方法?

    Stream流的思想类似于一个生产车间的流水线。当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步驱方案,然后再按照方案去执行它。

    Java8新特性Stream流使用方法?

    Stream(流)是一个来自数据源的元素队列

    元素是 特定类型的对象,形成一个队列。lava中的Stream并不会存储元素,而是按需计算。

    数据源 流的来源。可以是集合,数组等。

    Stream的两个基础的特征:

    ·Pipelining:中间操作都会饭回流对象本身。这样多个操作可以事联成一个管道,如同流式风格(fluentstyle)。这样做可以对操作进行优化,比如延迟执行(laziness)和短路(short-circuiting)。

    内部迭代:以前对集合遍历都是通过iterator或者增强for的方式显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,流可以直接调用遍历方法。

    当使用一个流的时候,通常包括三个基本步骤:获取一个数据源(source)→数据转换一执行操作获取想要的结果,每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道。

    Stream流的获取

    获取流的常用方式有2种:

    1.通过Collection集合获取

    2.Stream接口的静态方法of获取

    通过Collection集合获取

    所有的Collection集合都可以通过stream默认方法获取流

    //把集合转换为stream流
    
    //list集合
    
    Listlist=new ArrayList<>();
    
    Streamstream=list.stream();
    
    //set集合
    
    Setset=new HashSet<>();
    
    Streamstream2=set.stream();
    
    //map集合(map集合需要间接的转换)
    
    Mapmap=new HashMap<>();
    
    //方法一:获取键,存储到一个set集合中
    
    SetkeySet=map.keySet();
    
    Streamstream3=keySet.stream();
    
    //方法二:获取值,存储到一个collection集合中
    
    Collectionvalues=map.values();
    
    Streamstream4=values.stream();
    
    //方法三:获取键值对,,键与值的映射关系,entrySet()
    
    Set>entries=map.entrySet();
    
    Stream>stream5=entries.stream();

    2.Stream接口的静态方法of获取

    Stream接口的静态方法of可以获取数组对应的流。

    参数是一个可变参数,那么我们就可以传递一个数组

    //把数组转换成Stream流
    
    Streamstream6=Stream.of(1,2,3,4,5);
    
    //可变参数可以传递数组
    
    Integer[]arr={1,2,3,4,5};
    
    Streamstream7=Stream.of(arr);
    
    String[]arr2={"a","bb","ccc"};
    
    Streamstream8=Stream.of(arr2);

    stream流的常用方法

    stream的常用方法分为两类:

    延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为延迟方法。)

    终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。

    Java8新特性Stream流使用方法?

    以上是一些stream流的常用方法,下面我们就依次学习一下这些方法的使用。

    forEach遍历方法

    该方法接受一个Consumer接口函数,会将每一个流元素交给函数进行处理。Consumer接口是一个消费性的函数式接口,可以传递lambda表达式,消费数据。

    foeeach方法,用来遍历流中的数据,是一个终结方法,遍历之后就不能使用流中的其他方法。

    基本使用

    public class Demo03Stream_forEach {
    
    public static void main(String[] args) {
    
    Streamstream=Stream.of("张三","李四","王五","赵六","小明","小胖");
    
    /*stream.forEach((String name)->{
    
    System.out.println(name);
    
    });*/
    
    stream.forEach(name->System.out.println(name));
    
    }
    
    }

    filter过滤方法

    用于对Stream流中的数进行过滤。filter方法的参数Predicatehi一个函数式接口,所以可以传递lambda表达式,对数据进行过滤。可以通过filter方法将一个转换过滤为下一个流,如下图:

    Java8新特性Stream流使用方法?

    上面这个图把一些不也一样的元素,用filter方法进行过滤,然后成为新的流。


    基本使用

    public class Demo04Stream_filter {
    
    public static void main(String[] args) {
    
    //创建一个Stream流
    
    Streamstream=Stream .of("张三丰","赵敏","张无忌","周芷若","张三","狮王","张大牛");
    
    //对Stream流中的元素进行过滤。只要张的人
    
    Streamstream2=stream.filter((String name)->{return name.startsWith("张");});
    
    //遍历Stream流
    
    stream2.forEach(name->System.out.println(name));
    
    }
    
    }

    map映射方法(转换)

    如果需要将流中的元素转换到另一个流中,可以使用map方法。该接口需要一个Funtion函数式接口参数,可以将当前流中的T类型数据类型转换为另一种R类型的数据流,如下图:

    Java8新特性Stream流使用方法?

    上面的图将不同元素的数据转换成用一种类型的元素。


    基本使用

    public class Demo05Stream_map {
    
    public static void main(String[] args) {
    
    //获取一个String类型的Stream流
    
    Streamstream=Stream.of("1","2","3","4","5");
    
    //使用map方法,把字符串类型的整数,转换(映射)为integer类型的整数
    
    Streamstream2=stream.map((String s)->{
    
    return Integer.parseInt(s);
    
    });
    
    //遍历Stream流
    
    stream2.forEach(i->System.out.println(i));
    
    }
    
    }

    count统计元素个数方法

    用于统计Stream流中的元素个数,count方法是一个终结方法,返回值是一个Long类型的整数。所以不能再继续调用Stream流中的其他方法了

    基本使用

    public class Demo06Stream_count {
    
    public static void main(String[] args) {
    
    //获取一个Stream流
    
    ArrayListlist=new ArrayList();
    
    //添加元素
    
    list.add(1);
    
    list.add(2);
    
    list.add(3);
    
    list.add(4);
    
    list.add(5);
    
    list.add(6);
    
    list.add(7);
    
    Streamstream=list.stream();
    
    //统计stream流中的元素个数
    
    long count=stream.count();
    
    //打印输出
    
    System.out.println(count);//7
    
    }
    
    }

    limit截取流元素方法

    Limit方法可以对流进行截取,只取用前n个。参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作。limit方法是一个延迟方法,只是对流中的元素进行截取,返回一个新的流,使用可以继续调用stream流中的其他方法。

    Java8新特性Stream流使用方法?

    基本使用

    public class Demo07Stream_limit {
    
    public static void main(String[] args) {
    
    show02();
    
    }
    
    private static void show02() {
    
    //创建一个String类型的数组
    
    String[]arr={"喜羊羊","美羊羊","沸羊羊","懒羊羊","灰太狼","红太狼"};
    
    //集合获取一个Stream流
    
    Streamstream=Stream.of(arr);
    
    //用limit方法截取前6个元素
    
    Streamstream2=stream.limit(3);
    
    //遍历Stream2流
    
    stream2.forEach(i->System.out.println(i));
    
    }
    
    }

    skip跳过元素方法

    如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流,如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的流。

    Java8新特性Stream流使用方法?

    基本使用

    public class Demo08Stream_skip {
    
    public static void main(String[] args) {
    
    //创建一个String类型的数组
    
    String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"};
    
    //获取Stream流
    
    Streamstream=Stream.of(arr);
    
    //使用skip方法截取后面的元素
    
    Streamstream2=stream.skip(5);
    
    //遍历stream2流
    
    stream2.forEach(i->System.out.println(i));
    
    }
    
    }

    concat:合并方法

    用于把流组合到一块。如果有两个流,希望合并成为一个流,就可以使用concat方法

    Java8新特性Stream流使用方法?

    基本使用

    public class Demo09Stream_concat {
    
    public static void main(String[] args) {
    
    //创建一个Stream流
    
    Streamstream=Stream.of("张三丰","张翠山","赵敏","周芷若","张无忌");
    
    //创建一个String类型的数组
    
    String[]arr={"喜羊羊","美羊羊","懒羊羊","慢羊羊","红太狼","灰太狼","小灰灰","沸羊羊","软绵绵","武大狼"};
    
    //获取Stream流
    
    Streamstream2=Stream.of(arr);
    
    //使用常用方法concat方法合并流
    
    Streamstream3=Stream.concat(stream, stream2);
    
    //遍历Stream3流
    
    stream3.forEach(i->System.out.println(i));
    
    }
    
    }

    Stream流的练习

    最后,我们通过下面的练习来巩固一下上面所学的内容。

    现在有两个ArrayList集合存储队伍当中的多个成员姓名,

    要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:

    1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。

    2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。

    3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。

    4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。

    5.将两个队伍合并为一个队伍;存储到一个新集台中。

    6.根据姓名创建Person对象:存储到一个新集合中,

    7.打印整个队伍的Person对象信息。


    示例:

    第一支队伍:迪丽热巴、宋远桥、苏星河、石破天、石中玉、老子、庄子、洪七公


    第二支队伍:古娜力扎、张无忌、赵丽颖、张三丰、尼古拉斯赵四、张天爱、张二狗

    首先创建Person对象类

    public class Person {
    
    private String name;
    
    public Person() {
    
    super();
    
    }
    
    public Person(String name) {
    
    super();
    
    this.name = name;
    
    }
    
    public String getName() {
    
    return name;
    
    }
    
    public void setName(String name) {
    
    this.name = name;
    
    }
    
    @Override
    
    public String toString() {
    
    return "Person [name=" + name + "]";
    
    }
    
    }

    然后再根据习题要求用Stream流进行过滤

    1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。

    2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。

    // 第一支队伍
    
    // 创建集合
    
    ArrayList one = new ArrayList<>();
    
    // 添加元素
    
    one.add("迪丽热巴");
    
    one.add("宋远桥");
    
    one.add("苏星河");
    
    one.add("石破天");
    
    one.add("石中玉");
    
    one.add("老子");
    
    one.add("庄子");
    
    one.add("洪七公");
    
    //1.第一个队伍只要名字为3个字的成员姓名:存储到一个新集合中。
    
    //2.第一个队伍筛选之后只要前3个人;存储到一个新集合中。
    
    StreamoneStream=one.stream().filter(name->name.length()==3).limit(3);

    3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。

    4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。

    // 第二支队伍
    
    // 创建集合
    
    ArrayList tow = new ArrayList<>();
    
    // 添加元素
    
    tow.add("古娜力扎");
    
    tow.add("张无忌");
    
    tow.add("赵丽颖");
    
    tow.add("张三丰");
    
    tow.add("尼古拉斯赵四");
    
    tow.add("张天爱");
    
    tow.add("张二狗");
    
    //3.第二个队伍只要姓张的成员姓名;存储到一个新集合中。
    
    //4.第二个队伍筛选之后不要前2个人;存储到一个新集合中。
    
    StreamtowStream=tow.stream().filter(name->name.startsWith("张")).skip(2);

    5.将两个队伍合并为一个队伍;存储到一个新集台中。

    6.根据姓名创建Person对象:存储到一个新集合中,

    7.打印整个队伍的Person对象信息。

    //5.将两个队伍合并为一个队伍;存储到一个新集台中。
    
    //6.根据姓名创建Person对象:存储到一个新集合中,
    
    //7.打印整个队伍的Person对象信息。
    
    Stream.concat(oneStream,towStream).map(name->new Person(name)).forEach(p->System.out.println(p));

    Java8新特性Stream流使用方法?

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。