从零学Java - Stream API

news2024/11/15 11:06:02

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;
        }
    }
}

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

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

相关文章

什么是WAF

WAF是Web应用防火墙&#xff08;Web Application Firewall&#xff09;的简称&#xff0c;是一款通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。 WAF主要用于防御Web应用攻击&#xff0c;例如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、网页…

Win10/11中VMware Workstation设置网络桥接模式

文章目录 一、添加VMware Bridge Protocol服务二、配置桥接参数1.启用系统Device Install Service服务2.配置VMware 需要确认物理网卡是否有添加VMware Bridge Protocol服务 添加VMware Bridge Protocol服务 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

代码随想录算法训练营DAY24|回溯1

算法训练DAY24|回溯1 第77题. 组合 力扣题目链接 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 上面我们说了要解决 n为100&#xff0c;k为50的情况&#xff0…

Xcode查看APP文件目录

一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容&#xff0c;获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容&#xf…

Kui: 一个用于 Kubernetes 的“混合”CLI/GUI 应用程序

众所周知&#xff0c;当涉及到管理服务器或 Kubernetes 集群之类的事情时&#xff0c;我们大多数人更喜欢使用我们心爱的终端而不是 GUI 工具。对于许多人来说&#xff0c;这就像驾驶一辆带有手动变速箱的汽车&#xff1a;简单、舒适、灵活且更可预测。Kui 是一个混合界面工具&…

Servlet系列:生命周期(init、 service、destroy)详解

Servlet的生命周期是由Web容器&#xff08;如Tomcat&#xff09;管理的&#xff0c;包括以下三个阶段&#xff1a; 加载和实例化&#xff1a;当Web应用程序启动时&#xff0c;Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成&#xff0c;也可以通…

python爬虫零基础学习之简单流程示例

文章目录 爬虫基础爬虫流程常用库爬虫示例Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全职路线 爬虫基础 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为…

HNU-数据挖掘-实验1-实验平台及环境安装

数据挖掘课程实验实验1 实验平台及环境安装 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验1 实验平台及环境安装实验背景实验目标实验步骤1.安装虚拟机和Linux平台&#xff0c;熟悉Ubuntu环境。2.在Linux平台上搭建Python平台&#xff0c;并安装…

java基础学习: 什么是泛型的类型擦除

文章目录 一、什么是泛型2、泛型编译前和编译后对比3、泛型的优点&#xff08;1&#xff09;提高了代码的复用性和可读性&#xff08;2&#xff09;提高了代码的安全性 二、泛型的定义1、泛型类2、泛型接口3、泛型方法 三、泛型通配符1、&#xff1f;和T有什么区别2、通配符的分…

JOSEF约瑟 零序电流继电器 JL-8D/2X122A4(S) 0-30AAC 220VDC

系列型号 JL-8D/3X1定时限电流继电器&#xff1b;JL-8D/3X111A2定时限电流继电器&#xff1b; JL-8D/3X121A2定时限电流继电器&#xff1b;JL-8D/3X211A2定时限电流继电器&#xff1b; JL-8D/3X221A2定时限电流继电器&#xff1b;JL-8D/3X2定时限电流继电器&#xff1b; JL-8D/…

【开放原子校园行】开发者投身开源项目的能够获得什么?

目录 前言开源软件不仅是免费&#xff0c;更是一种创新和共享的精神开发者投身开源项目的收获番外篇结束语 前言 作为开发者&#xff0c;编程不仅是工作和饭碗&#xff0c;也是兴趣爱好的体现。虽然说有一部分是为了生活才选择了编程开发&#xff0c;但是大部分开发者是因为兴…

文件操作与IO(3)

文件内容的读写--数据流 这里我们将要讲到文件操作中的重要概念--流. 之前也在C语言讲解中提到了文件流的概念---读写文件内容 分为这几步:(1)打开文件;(2)读/写文件;(3)关闭文件. 数据流主要分为字节流和字符流. 字节流:以字节为单位进行读写(代表:InputStream,OutputStrea…

数据结构之使用顺序表写出通讯录

前言 昨天我们踏入了数据结构的深山&#xff0c;并且和顺序表battle了一番&#xff0c;虽说最后赢了&#xff0c;但同时也留下了一个问题&#xff1a;如何从顺序表的增删查改加强到通讯录的的增删查改&#xff0c;别急&#xff0c;今天就带你一探究竟。 一.回顾与思考 我们昨…

二维码地址门牌管理系统:预约安全、智能生活

文章目录 前言一、访客预约功能二、安全性保障三、智慧小区生活 前言 二维码地址门牌管理系统的出现不仅提升了小区的安全性&#xff0c;还为访客提供了更便捷的预约服务&#xff0c;让亲朋好友轻松进入小区。 一、访客预约功能 该系统提供了访客预约功能&#xff0c;业主可为…

【GitHub项目推荐--12306 抢票助手 python】【转载】

这个项目名很干脆&#xff0c;不知道以为是 12306 网站的源码&#xff0c;其实不是这是全 GitHub最德高望重的抢票小助手&#xff0c;功能一直在更新&#xff0c;且现已支持 Python 3.6 以上版本。 开源地址&#xff1a;https://github.com/testerSunshine/12306

安装向量数据库milvus可视化工具attu

使用docker安装的命令和简单就一个命令&#xff1a; docker run -p 8000:3000 -e MILVUS_URL{milvus server IP}:19530 zilliz/attu:v2.3.5sunyuhuasunyuhua-HKF-WXX:~/dockercom/milvus$ docker run -p 8000:3000 -e MILVUS_URL127.0.0.1:19530 zilliz/attu:latest yarn run…

代码随想录 Leetcode1047. 删除字符串中的所有相邻重复项

题目&#xff1a; 代码(首刷自解 2024年1月21日&#xff09;&#xff1a; class Solution { public:string removeDuplicates(string s) {if (s.size() < 2) return s;stack<char> t;for (int i 0; i < s.size(); i) {if (t.empty()) t.push(s[i]);else {if (s[i…

IoC 容器总结

目录 理解 IoC 实现方式 DI 实现原理 Autowired VS Resource 区别 IoC 和 DI 有什么区别 理解 IoC IoC——控制反转&#xff0c;是 Spring 框架的核心概念之一&#xff0c;是一种设计原则和编程模式&#xff0c;用于实现松耦合和可测试的应用程序 控制反转&#xff1a;对…

《二叉树》——1

目录 前言&#xff1a; 二叉树的链式结构 二叉树的遍历 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 总结&#xff1a; 前言&#xff1a; 从本文开始&#xff0c;将进一步深入学习编程语言思想&#xff0c;从二叉树开始我们将接触许许多多的递归算…

力扣hot100 合并两个有序链表 递归 双指针

Problem: 21. 合并两个有序链表 文章目录 &#x1f496; 递归思路 &#x1f496; 双指针 &#x1f496; 递归 思路 &#x1f468;‍&#x1f3eb; 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂…