从零学Java - Stream API

Java - Stream API

文章目录

  • Java - Stream API
    • 什么是流(Stream)?
    • Stream 的特点
    • Stream使用步骤
      • 1 创建 Stream流
      • 2 中间操作
      • 3 终止操作

什么是流(Stream)?

流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作。

在这里插入图片描述

Stream 的特点

  • Stream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
  • Stream 操作是延迟执行的,会等到需要结果的时候才执行。

Stream使用步骤

  1. 创建:新建一个流。
  2. 中间操作:在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。
  3. 终止操作:使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该Stream就不能使用了。

1 创建 Stream流

代码演示:

public class TestStream1 {
    public static void main(String[] args) {
        //新建流
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三锋");
        list.add("张无极");
        list.add("赵梦露");
        list.add("张黎");
        list.add("田美丽");
        //1 通过Collection对象的stream()方法(单线程)或parallelStream()方法(多线程)。
        list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);
        //
        //2 通过Arrays类的stream()方法。
        int[] nums = {10,2,8,1,17,24};
        Arrays.stream(nums).sorted().forEach(System.out::println);
        //
        //3 通过Stream接口的of()、iterate()、generate()方法。
        Stream.of(5,3,6,13,1,8).sorted().forEach(System.out::println);
        //
        //4 通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。
        //生成一个0~99的数组的流(含头不含尾)
        IntStream.range(0,100).forEach(System.out::println);
        //生成一个0~100的数组的流(含头含尾)
        IntStream.rangeClosed(0,100).forEach(System.out::println);
    }
}

2 中间操作

代码演示:

public class TestStream2 {
    public static void main(String[] args) {
        ArrayList<Employee> employees = new ArrayList<>();
        employees.add(new Employee("张三",22,18000));
        employees.add(new Employee("李四",23,20000));
        employees.add(new Employee("王五",25,22000));
        employees.add(new Employee("酒玖",20,25000));
        employees.add(new Employee("张利",22,26000));
        employees.add(new Employee("壮武吉",27,30000));
        //1  filter、limit、skip、distinct、sorted
        //filter 过滤
        employees.stream()
                .filter(e->e.getSalary()>=25000)
                .forEach(System.out::println);
        System.out.println("------------");
        //limit 限制
        employees.stream()
                .limit(2)
                .forEach(System.out::println);
        //skip 跳过指定的元素个数
        System.out.println("-----");
        employees.stream()
                .skip(2)
                .limit(2)
                .forEach(System.out::println);
        System.out.println("-----");
        //distinct: 去掉重复元素 hashcode和equals
        employees.stream()
                .distinct()
                .forEach(System.out::println);
        //sorted:排序
        System.out.println("----------");
        employees.stream()
                .sorted((e1,e2)->Double.compare(e1.getSalary(),e2.getSalary()))
                .forEach(System.out::println);
        // 2 map映射
        System.out.println("--------map-------");
        //需求:遍历所有的姓名
        employees.stream()
                .map(Employee::getName)
                .forEach(System.out::println);
    }
    static class Employee{
        private String name;
        private int age;
        private int salary;

        public Employee() {
        }

        public Employee(String name, int age, int salary) {
            this.name = name;
            this.age = age;
            this.salary = salary;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public int getSalary() {
            return salary;
        }

        public void setSalary(int salary) {
            this.salary = salary;
        }

        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", salary=" + salary +
                    '}';
        }
    }
}

3 终止操作

代码演示:

public class TestStream3 {
    public static void main(String[] args) {
        //1 forEach、min、max、count
        List<Integer> list=new ArrayList<>();
        list.add(20);
        list.add(18);
        list.add(15);
        list.add(22);
        list.add(30);
        //forEach 遍历元素
        list.stream()
                .forEach(System.out::println);
        System.out.println("-------min-------");
        //min 最小元素
        //Optional: 封装元素的容器,目的避免空指针异常。
        Optional<Integer> optional1 = list.stream()
                .min((o1, o2) -> o1 - o2);
        System.out.println(optional1.get());
        System.out.println("-------max-------");
        //min 最大元素
        //Optional: 封装元素的容器,目的避免空指针异常。
        Optional<Integer> optional2 = list.stream()
                .max((o1, o2) -> o1 - o2);
        System.out.println(optional2.get());
        // count 元素个数
        System.out.println("-----count----");
        long count = list.stream().count();
        System.out.println(count);

        //reduce  规约,统计
        //统计所有元素总和
        System.out.println("----reduce------------");
        Optional<Integer> sum = list.stream()
                .reduce((x, y) -> x + y);
        System.out.println(sum.get());
        //collect 收集
        //把所有的人的姓名转成List集合
        List<Student> students=new ArrayList<>();
        students.add(new Student("张三1",20,"男",100));
        students.add(new Student("张三2",20,"男",100));
        students.add(new Student("张三3",20,"男",100));
        students.add(new Student("张三4",20,"男",100));
        students.add(new Student("张三5",20,"男",100));
        List<String> names = students.stream()
                .map(Student::getName)
                .collect(Collectors.toList());
        System.out.println(names);

    }
    static  class Student{
        private String name;
        private int age;
        private String gender;
        private double score;

        public Student() {
        }

        public Student(String name, int age, String gender, double score) {
            this.name = name;
            this.age = age;
            this.gender = gender;
            this.score = score;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public double getScore() {
            return score;
        }

        public void setScore(double score) {
            this.score = score;
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信怎么设置自动回复?教程来咯!

自动回复信息 你有没有为了回复微信消息&#xff0c;中断工作进度&#xff0c;耽误了大量时间&#xff1f;或者错过了潜在客户&#xff1f;现在&#xff0c;我们的微信管理系统&#xff0c;可以帮助你在第一时间&#xff0c;实时回复用户消息。 01 # 通过好友自动打招呼# 我们…

技术浪潮中的职业变革:程序员面临的裁员挑战与应对策略

目录 前言 冲破时空壁垒&#xff1a;探索技术变革的酷时代&#xff01; 逆境成长&#xff1a;一个互联网人战胜失业困境的故事 裁员的双面影响&#xff1a;挑战与机遇 应对裁员潮危机&#xff1a;程序员的超级英雄之路 前言 惊人的新闻传来&#xff0c;一对来自中国的工程师…

【Linux与windows的文件互相传输】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 关于 rzsz 注意事项 查看软件包 使用命令 下载到本地&#xff08;使用sz的命令&#xff09; 本地文件上传到Linux中&#xff08;使用rz命令&#xff09; 方法一…

Jumpserver中安装httpx

查看已安装的包 pip freeze # python -V # Python 2.7.5安装anyio 刚开始直接pip install httpx&#xff0c;未设置版本号&#xff0c;因已有idna2.7&#xff0c;所以出现版本不兼容的现象 anyio 3.0.0 requires idna>2.8, but you have idna 2.7 which is incompatible.…

【python】python实现代码雨【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现模…

惬意上手Python —— os模块

首先&#xff0c;这部分很简单&#xff0c;不需要有太多的操作&#xff0c;只需要用的时候你知道该用这个模块下的哪个函数。例如&#xff0c;你想知道当前路径&#xff0c;就该知道用 curdir 这个函数。 在Python中&#xff0c;os模块是一个与操作系统交互的标准库模块&…

前端面试题-(BFC,前端尺寸单位,网站页面常见的优化手段)

前端面试题-BFC&#xff0c;前端尺寸单位&#xff0c;网站页面常见的优化手段 BFC前端尺寸单位网站页面常见的优化手段 BFC BFC&#xff08;block formartting context&#xff09;块格式化上下文。是通过独立渲染的区域&#xff0c;它拥有自己的渲染规则&#xff0c;可以决定…

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

pytest+allure 生成中文报告

背景 已安装pytestallure&#xff0c;生成的报告是英文 allure生成中文报告 参考&#xff1a;allure report 报告中文化及其它优化 方法1&#xff1a;直接在报告中切换中文 方法2&#xff1a;依赖系统中文语言 创建一个setting.js 文件在index.html 同级目录 // 尝试从 l…

Python - 【Socket】消息粘包处理demo(一)

一. 前言 在网络编程中&#xff0c;粘包是指TCP协议在传输过程中&#xff0c;多条数据被合并成一条数据发送或者一条数据被拆分成多个数据发送的现象。 二. 粘包问题的常规处理方法&#xff1a; 使用固定长度的包头 可以在发送数据前先发送一个固定长度的包头&#xff0c;包…

赠书活动~

关注公众号获得&#xff0c;发送抽奖

hcip---ppp协议

一&#xff1a;网络类型----根据二层数据链路层使用协议的不同&#xff0c;进行的划分 MA--多点接入网络 BMA--广播型多点接入网络 NBMA--非广播型多点接入网络 P2P--点到点网络&#xff1a;当网络中只能两台设备存在&#xff0c;那么这样的网络不需要MAC也能进行通信 二层协议…

用Axure RP 9制作滑块

制作流程 1.打开界面 放置一个水平线 修改长为400 线段为5 2.放入圆 如图 3.修改圆的长和宽 如图 4.将圆变成动态面板 5.设置交互事件 如图 6.增加交互事件 7.增加 8.修改成跟随水平

系统架构演变

1.1系统架构的演变 2008年以后&#xff0c;国内互联网行业飞速发展&#xff0c;我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了&#xff0c;像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限&#xff0c;传统的IT企业”能用就行”的开发思…

查看并解析当前jdk的垃圾收集器

概述&#xff1a;复习的时候&#xff0c;学看一下。 命令&#xff1a; -XX:PrintCommandLineFlags 打开idea&#xff0c;配置jvm 把上面命令输入jvm options中即可。 举例代码 这个代码的解析&#xff0c;我上篇文章有写&#xff0c;这个跟本文没有任何关系&#xff1a; …

Elasticsearch 常用信息

简述 本文针对 Elasticsearch&#xff08;简称ES&#xff09;集群6.x版本出现故障时&#xff0c;可通过提供的命令进行排查。 1、集群健康状态 集群健康状态状态说明red不是所有的主要分片都可用。表示该集群中存在不可用的主分片。可以理解为某个或者某几个索引存在主分片丢失…

C#,入门教程(31)——预处理指令的基础知识与使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(30)——扎好程序的笼子&#xff0c;错误处理 try catchhttps://blog.csdn.net/beijinghorn/article/details/124182386 Visual Studio、C#编译器以及C#语法所支持的预处理指令&#xff0c;绝对是天才设计。 编译程序的时候会发现&am…

AI搜索引擎Perplexity来了,谷歌等老牌搜索引擎或许会有新的威胁?

Perplexity AI 是一家 AI 搜索初创公司&#xff0c;它通过结合内容索引技术和大型语言模型的推理能力&#xff0c;提供更便捷和高效的搜索体验。另外&#xff0c;最近很火的小兔子Rabbit R1硬件AI设备中的搜索功能正是这家公司的杰作。在短短一年半的时间里&#xff0c;一个企业…

Qt6入门教程 10:菜单栏、工具栏和状态栏

目录 一.菜单栏 1.Qt Designer 1.1添加菜单和菜单项 1.2添加二级菜单 1.3给菜单和菜单项添加图标 1.4给菜单项添加功能 2.纯手写 二.工具栏 1.Qt Designer 1.1添加工具栏按钮 1.2工具栏的几个重要属性 2.纯手写 三.状态栏 1.Qt Designer 2.纯手写 用Qt Creator新…

Elasticsearch分布式一致性原理剖析(二)-Meta篇

Elasticsearch分布式一致性原理剖析(二)-Meta篇 - 知乎 本文首发于云栖社区(Elasticsearch分布式一致性原理剖析(二)-Meta篇-博客-云栖社区-阿里云 )&#xff0c;由原作者转载。 前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行…