JDK8新特性:Stream流

news2024/11/15 13:51:11

目录

1.获取Stream流

2.Stream流常见的中间方法

3.Stream流常见的终结方法

1、 Stream 是什么?有什么作用?结合了什么技术?
●也叫 Stream 流,是Jdk8开始新增的一套 API ( java . util . stream .*),可以用于操作集合或者数组的数据。.

优势: Stream 流大量的结合了 Lambda 的语法风格来编程,提供了一种更加强大更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
2、说说 Stream 流处理数据的步骤是什么?

package com.xinbao.d8_stream;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest1 {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        Collections.addAll(names,"张三丰", "张无忌", "周芷若", "赵敏", "张强");
        System.out.println(names);
        //找出姓张且是三个字的名字,存到新集合中去
        List<String> list = new ArrayList<>();
        for (String name : names) {
            if (name.startsWith("张") && name.length() == 3){
                list.add(name);
            }
        }
        System.out.println(list);

        //使用Stream流解决问题
        List<String> list2 = names.stream().filter(s -> s.startsWith("张"))
                .filter(a -> a.length() == 3).collect(Collectors.toList());
        System.out.println(list2);
    }
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=4519:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\collection-map-stream-app com.xinbao.d8_stream.StreamTest1
[张三丰, 张无忌, 周芷若, 赵敏, 张强]
[张三丰, 张无忌]
[张三丰, 张无忌]
1.获取Stream流

package com.xinbao.d8_stream;

import java.util.*;
import java.util.stream.Stream;

public class StreamTest2 {
    public static void main(String[] args) {
        //1.如何获取List集合的Stream流
        List<String> names = new ArrayList<>();
        Collections.addAll(names,"张三丰", "张无忌", "周芷若", "赵敏", "张强");
        Stream<String> stream = names.stream();

        //2.如何获取Set集合的Stream流
        Set<String> set = new HashSet<>();
        Collections.addAll(set,"刘德华", "张曼玉", "张国荣", "刘嘉玲", "王祖贤");
        Stream<String> stream1 = set.stream();//alt + enter
        stream1.filter(s -> s.contains("张")).forEach(s -> System.out.println(s));

        //3.如何获取Map集合的Stream流
        Map<String,Double> map = new HashMap<>();
        map.put("古力娜扎", 167.5);
        map.put("迪丽热巴", 164.5);
        map.put("马尔扎哈", 187.7);
        map.put("哈尼克孜", 163.8);

        Set<String> keys = map.keySet();
        Stream<String> ks = keys.stream();

        Collection<Double> values = map.values();
        Stream<Double> vs = values.stream();

        Set<Map.Entry<String, Double>> entries = map.entrySet();
        Stream<Map.Entry<String, Double>> kvs = entries.stream();
        kvs.filter(s -> s.getKey().contains("哈")).
                forEach(s -> System.out.println(s.getKey() + "-->" + s.getValue()));

        //4.如何获取数组的Stream流
        String[] names2 = {"刘德华", "张曼玉", "张国荣", "刘嘉玲", "王祖贤"};
        Stream<String> stream2 = Arrays.stream(names2);
        Stream<String> names21 = Stream.of(names2);
    }
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=39123:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\collection-map-stream-app com.xinbao.d8_stream.StreamTest2
张国荣
张曼玉
马尔扎哈-->187.7
哈尼克孜-->163.8
2.Stream流常见的中间方法

package com.xinbao.d6_map_impl;

import java.util.Objects;


public class Student implements Comparable<Student>{
    private String name;
    private int age;
    private double height;

    //this o
    @Override
//    public int compareTo(Student o) {
//        return this.age - o.age;//年龄升序
//    }
    public int compareTo(Student o) {
        return o.age - this.age;
    }

    public Student() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Double.compare(student.height, height) == 0 && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, height);
    }

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

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

    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 double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}

package com.xinbao.d8_stream;

import com.xinbao.d6_map_impl.Student;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest3 {
    public static void main(String[] args) {
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores,88.5,22.5,88.7,56.9,24.8,46.7,96.3);
        //需求1:找出成绩大于60的数据,排序输出
        scores.stream().filter(s -> s>60).sorted().forEach(s -> System.out.println(s));

        List<Student> students = new ArrayList<>();
        students.add(new Student("蜘蛛精", 25, 168.5));
        students.add(new Student("蜘蛛精", 25, 168.5));
        students.add(new Student("至尊宝", 23, 163.5));
        students.add(new Student("牛魔王", 28, 183.5));
        System.out.println(students);

        //需求2:找出年龄大于23小于30的学生,升序输出
        students.stream().filter(s -> s.getAge() > 23 && s.getAge() < 30)
                .sorted((o1,o2) -> o1.getAge() - o2.getAge()).forEach(System.out::println);

        //需求3:取出身高最高的前三名学生,并输出
        System.out.println("-------------------------------------------------------------");
        students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .limit(3).forEach(System.out::println);

        //需求4:取出身高倒数的两名学生输出
        System.out.println("-------------------------------------------------------------");
        students.stream().sorted((o1,o2) -> Double.compare(o2.getHeight(),o1.getHeight()))
                .skip(students.size() - 2).forEach(System.out::println);

        //需求5:找出身高超过168的学生名字,去重再输出
        System.out.println("--------------------------------------------------------------");
        students.stream().filter(s -> s.getHeight()>168).map(Student::getName)//.map(s->s.getName) 映射
                .distinct().forEach(System.out::println);

        //distinct去重复,自定义类型的对象(希望内容一样就认为重复,重写hashCode,equals)
        students.stream().filter(s -> s.getHeight()>168).distinct().forEach(System.out::println);

        Stream<String> ls = Stream.of("李四", "王五", "刘六六");
        Stream<String> zs = Stream.of("张三");
        Stream<String> concat = Stream.concat(ls, zs);
        concat.forEach(System.out::println);
    }
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=26802:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\collection-map-stream-app com.xinbao.d8_stream.StreamTest3
88.5
88.7
96.3
[Student{name='蜘蛛精', age=25, height=168.5}, Student{name='蜘蛛精', age=25, height=168.5}, Student{name='至尊宝', age=23, height=163.5}, Student{name='牛魔王', age=28, height=183.5}]
Student{name='蜘蛛精', age=25, height=168.5}
Student{name='蜘蛛精', age=25, height=168.5}
Student{name='牛魔王', age=28, height=183.5}
-------------------------------------------------------------
Student{name='牛魔王', age=28, height=183.5}
Student{name='蜘蛛精', age=25, height=168.5}
Student{name='蜘蛛精', age=25, height=168.5}
-------------------------------------------------------------
Student{name='蜘蛛精', age=25, height=168.5}
Student{name='至尊宝', age=23, height=163.5}
--------------------------------------------------------------
蜘蛛精
牛魔王
Student{name='蜘蛛精', age=25, height=168.5}
Student{name='牛魔王', age=28, height=183.5}
李四
王五
刘六六
张三
3.Stream流常见的终结方法

package com.xinbao.d8_stream;

import com.xinbao.d6_map_impl.Student;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest4 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 25, 168.5);
        Student s2 = new Student("蜘蛛精", 25, 168.5);
        Student s3 = new Student("至尊宝", 23, 163.5);
        Student s4 = new Student("牛魔王", 28, 183.5);
        Student s5 = new Student("狐狸精", 23, 161.5);
        Student s6 = new Student("白骨精", 25, 161.5);
        Collections.addAll(students, s1, s2, s3, s4, s5, s6);

        //需求1:计算出高于168的人数
        long count = students.stream().filter(s -> s.getHeight() > 168).count();
        System.out.println(count);

        //需求2:找出最高学生对象并输出
        Student max = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();
        System.out.println(max);

        Optional<Student> max1 = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));
        System.out.println(max1);

        //需求3:找出最矮学生对象并输出
        Student min = students.stream().min((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();
        System.out.println(min);

        //需求4:找出高于165的学生对象,放到新集合中返回
        List<Student> collect = students.stream().filter(s -> s.getHeight() > 165).collect(Collectors.toList());
        System.out.println(collect);

        Set<Student> collect2 = students.stream().filter(s -> s.getHeight() > 165).collect(Collectors.toSet());
        System.out.println(collect2);//去重

        //流只能收集一次(类比迭代器)
//        Stream<Student> str = students.stream().filter(s -> s.getHeight() > 165);
//        List<Student> list = str.collect(Collectors.toList());
//        System.out.println(list);
//        Set<Student> set = str.collect(Collectors.toSet());//报错,流已经终结
//        System.out.println(set);

        //需求五:找出高于165的学生对象,并把对象的名字和身高,存入到一个Map集合返回
        Map<String,Double> map =
                students.stream().filter(s -> s.getHeight()>165)//不会自动去重,需要.distinct()去重
                        .distinct().collect(Collectors.toMap(a -> a.getName(), a -> a.getHeight()));
        System.out.println(map);

        Object[] objects = students.stream().filter(s -> s.getHeight() > 165).toArray();
        System.out.println(Arrays.toString(objects));
        Student[] students1 = students.stream().filter(s -> s.getHeight() > 165).toArray(len -> new Student[len]);
        System.out.println(Arrays.toString(students1));
    }
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=27234:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\collection-map-stream-app com.xinbao.d8_stream.StreamTest4
3
Student{name='牛魔王', age=28, height=183.5}
Optional[Student{name='牛魔王', age=28, height=183.5}]
Student{name='狐狸精', age=23, height=161.5}
[Student{name='蜘蛛精', age=25, height=168.5}, Student{name='蜘蛛精', age=25, height=168.5}, Student{name='牛魔王', age=28, height=183.5}]
[Student{name='牛魔王', age=28, height=183.5}, Student{name='蜘蛛精', age=25, height=168.5}]
{蜘蛛精=168.5, 牛魔王=183.5}
[Student{name='蜘蛛精', age=25, height=168.5}, Student{name='蜘蛛精', age=25, height=168.5}, Student{name='牛魔王', age=28, height=183.5}]
[Student{name='蜘蛛精', age=25, height=168.5}, Student{name='蜘蛛精', age=25, height=168.5}, Student{name='牛魔王', age=28, height=183.5}]

进程已结束,退出代码为 0

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

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

相关文章

【JAVA学习笔记】38 - 单例设计模式-静态方法和属性的经典使用

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、什么是设计模式 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。设计模式就像是…

【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了

【侵权联系删除】【文/郑尔巴金】 深度爆料&#xff0c;《完美世界》动漫第135集预告片已经更新了&#xff0c;但是网友们对此却是一脸槽点。从预告中可以看出&#xff0c;石昊在和战王战天歌的大战中被打成重伤&#xff0c;最后云曦也被战天歌抓住。在云曦面临生死危机的时候…

AIGC底层数据探索——高质量数据助力大模型迭代升级

// 编者按&#xff1a;近年来&#xff0c;大模型的概念逐渐受到更广泛的关注&#xff0c;而谈及大模型就离不开对底层数据的探索。 大模型训练数据痛点与中文数据集现状&#xff1b;高质量数据定义&#xff1b;对话式数据模型实验&#xff1b;晴数智慧高质量数据解决方案。 文…

信号补零对信号频谱的影响

文章目录 前言一、 什么是补零二、案例三、补零前仿真及分析1、补零前 MATLAB 源码2、仿真及结果分析①、 x n x_n xn​ 时域图②、 x n x_n xn​ 频谱图 四、补零后仿真及分析1、补6000个零且1000采样点①、 MATLAB 源码②、仿真及结果分析 2、波形分辨率3、补6000个零且7000采…

电子巡更和智能巡检关系

电子巡更和智能巡检是两种重要的安全巡查技术&#xff0c;它们之间相似相通。 电子巡更是一种基于传统巡更系统发展而来的技术&#xff0c;主要通过数字化手段对巡查工作进行记录和监督。它通常由巡更棒、信息钮和电子巡更软件组成。巡查人员在进行巡查时&#xff0c;需要携带…

Kafka集群搭建与SpringBoot项目集成

本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群&#xff0c;以及怎么在SpringBoot项目中使用Kafka。 kafka集群环境包地址&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;x9yn 一、Kafka集群搭建 1、准备环境 &#xff08;1&#xff09;准备三台…

泵站机电设备健康状态系统建立的关键

在现代工业运营中&#xff0c;泵站机电设备的健康管理至关重要。通过建立一套完善的泵站机电设备健康管理系统&#xff0c;可以有效地监测、诊断和维护设备&#xff0c;确保其正常运行和延长使用寿命。本文将从三个方面展开讨论&#xff0c;分别是泵站机电设备养护在设备健康管…

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

不懂项目管理三角,你的项目很难成功

在管理项目时&#xff0c;难免会出现影响项目的变更或其他问题。为了防止项目超出计划或超支&#xff0c;项目经理总是要平衡项目管理三角形&#xff08;由三个主要项目约束组成&#xff09;。 什么是项目管理三角形&#xff1f; 项目管理三角形由决定项目质量的三个约束组成…

LAMP项目部署实战

一、LAMP环境部署 1、回顾LAMP LAMP Linux Apache MySQL PHP Apache&#xff1a;主要用于接收用户的请求&#xff0c;处理业务逻辑&#xff0c;返回结果给客户端&#xff08;浏览器&#xff09; PHP&#xff1a;编程语言的一种&#xff0c;主要应用于Web开发。主要实现注…

python输出与数据类型

目标 1、使用print输出内容 2、熟悉字符串类型 3、熟悉数字类型 4、熟悉数字与字符串操作 输出 print可控制输出内容也可配合、-、*、/进行运算&#xff0c;和整数型配合可进行运算和字符型配合有不同效果&#xff0c;如为拼接&#xff0c;*为多次输出注&#xff1a;整数型如&…

【ROS入门】机器人系统仿真——URDF集成Gazebo

文章结构 URDF与Gazebo基本集成流程创建功能包编写URDF或Xacro文件启动 Gazebo 并显示机器人模型 URDF集成Gazebo相关设置collisioninertial颜色设置 URDF集成Gazebo实操编写封装惯性矩阵算法的 xacro 文件复制相关 xacro 文件&#xff0c;并设置 collision inertial 以及 colo…

嵌入式中的MCU、ARM、DSP、FPGA

目录 “角色扮演” MCU ARM 特点 DSP 特点 FPGA 特点 应用 “角色扮演” MCU&#xff08;Microcontroller Unit&#xff09;、ARM&#xff08;Advanced RISC Machine&#xff09;、DSP&#xff08;Digital Signal Processor&#xff09;和FPGA&#xff08;Field-Progr…

【Java 进阶篇】Java Servlet 执行原理详解

Java Servlet 是用于构建动态Web应用程序的关键组件之一。它允许开发者编写Java类来处理HTTP请求和生成HTTP响应&#xff0c;从而实现灵活、交互性强的Web应用。本篇博客将深入探讨Java Servlet的执行原理&#xff0c;适用于初学者&#xff0c;无需太多的先验知识。 什么是 Ja…

Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (四)

这篇博客是之前文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;二&a…

解决Linux下编译Intel oneTBB动态库出错的问题

在CMakeLists.txt中&#xff0c;原来有一段这样查找和链接的配置代码 find_library(tbblibaray ${tbb_path}) target_link_libraries(backalarm ${tbblibaray})编译后提示错误&#xff1a; /myapp/library/tbb/libtbb.so&#xff1a;对‘__cxa_throw_bad_array_new_lengthCX…

MATLAB源码-第55期】matlab代码基于m序列的多用户跳频通信系统仿真,输出各节点波形图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.跳频扩频调制 跳频扩频调制通过伪随机地改变发送载波频率&#xff0c;用跳变的频率来调制基带信号&#xff0c;得到载波频率不断变化的射频信号。 通常&#xff0c;跳频系统的频率合成器输出什么频率的载波信号是受跳频指…

harrypotter1-aragog靶机攻略

harrypotter1 扫描 nmap 指纹 目录 渗透 找到了登录位置 看到wordpress就用wpscan扫一扫 wpscan --url"http://10.4.7.153/blog" -e p --plugins-detection aggressive --api-tokend1fuMZc2tbhJWYk9VfNsl0GZlyYxkfH6bpL0pCKFhok扫描出有这些file manager漏洞 使用…

remount of the / superblock failed: Permission denied remount failed

雷电模拟器 挂载/system未读写总是失败 F:\Program\leidian\LDPlayer9>adb remount remount of the / superblock failed: Permission denied remount failed设置配置system.vmdk可写入 F:\Program\leidian\LDPlayer9>adb remount remount succeeded参考: https://www.…

排序-表排序

当我们需要对一个很大的结构体进行排序时&#xff0c;因为正常的排序需要大量的交换&#xff0c;这就会造成时间复杂度的浪费 因此&#xff0c;我们引入指针&#xff0c;通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路&#xff1a;通过开辟一个指针数组&…