Java jdk8新特性:Stream 流

一. Stream

        1. Stream也叫Stream流,是jdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。

        2. 优势:Stream流大量的结合了lambda的语言风格来编程,提供了一种更加强大,更加简洁的方式操作集合或者数组中的数据。

        3. 使用步骤:

                ① 获取Stream流

                ② Stream流常用的中间方法(支持链式调用)

                ③ Stream 流常见的终结方法

 public static void main(String[] args) {
        //Stream
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, "卡莎", "卡车", "泰坦", "璐璐", "卡拉", "卡卡卡", "伊泽");
        System.out.println(list);//[卡莎, 卡车, 泰坦, 璐璐, 卡拉, 卡卡卡, 伊泽]

        //list中方法 筛选数据
        List<String> list1 = new ArrayList<>();
        for(String str : list){
            if (str.contains("卡") && str.length() == 2){
                list1.add(str);
            }
        }
        System.out.println(list1);//[卡莎, 卡车, 卡拉]

        //使用stream流 筛选
        List<String> list2 = list.stream().filter(s -> s.contains("卡")).filter(s -> s.length() == 2).collect(Collectors.toList());
        System.out.println(list2);//v

}

二. Stream的常用方法

        1.  获取Stream流

方法说明
Collection提供的获取Stream流default Stream<E> stream()获取当前集合的Stream流
Arrays类提供的获取Stream流public static <T> Stream<T> stream(T[] array)获取当前数组的Stream流
Stream提供的获取Stream流public static<T> Stream<T> of(T... values)获取当前接收数据的Stream流
public static void main(String[] args) {

        //1. 获取List集合的Stream流
        List<String> list = new ArrayList<String>();
        Collections.addAll(list, "卡莎", "卡车", "泰坦", "璐璐", "卡拉", "卡卡卡", "伊泽");
        //获取Stream流
        Stream<String> stream = list.stream();

        //2. 获取Set集合的Stream流
        Set<String> set = new HashSet<String>();
        Collections.addAll(set, "大宇", "朵朵", "欢欢", "麦琪");
        //获取Stream流
        Stream<String> stream1 = set.stream();
        stream1.filter(s -> s.contains("欢")).forEach(System.out::println);

        //3. 获取Map集合的Stream流
        Map<String, String> map = new HashMap<>();
        map.put("杨过", "小龙女");
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("令狐冲", "东方不败");
        // 获取Stream流 分开处理
        Set set2 = map.entrySet();
        Stream<String> keys = set2.stream();
        Collection<String> values = map.values();
        Stream<String> vas = values.stream();

        //统一处理
        Set<Map.Entry<String, String>> entry = map.entrySet();
        Stream<Map.Entry<String, String>> kvs = entry.stream();
        kvs.filter(k -> k.getKey().contains("张")).forEach(System.out::println);


        //4. 获取数组的Stream流
        String[] str = {"路马", "天天", "莱德", "落落"};
        //public static <T> Stream<T> stream(T[] array)
        Stream<String> stream2 = Arrays.stream(str);
        //public static<T> Stream<T> of(T... values)
        Stream<String> stream3 = Stream.of(str);    
}

        2. Stream流常见的中间方法

                (1) 中间方法是指调用完成后返回新的Stream流,可以继续使用(支持链式编程)

常用方法说明
Stream<T> filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
Stream<T> sorted()对元素进行升序排序
Stream<T> sorted(Comparator<? super T> comparator)对元素按照指定规则排序
Stream<T> limit(long maxSize)获取前几个元素
Stream<T> skip(long n)跳过前几个元素
Stream<T> distinct()去除流中重复的元素
<R> Stream<R> map(Function<? super T, ? extends R> mapper)对元素进行加工,并返回对应的新流
static <T> Stream<T> concat(Stream a, Stream b)合并a和b两个流

public class Student{
    private String name;
    private int age;
    private double score;

    public Student() {
    }

    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        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 double getScore() {
        return score;
    }

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

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

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age, score);
    }
}
public static void main(String[] args) {
        List<Double> scores = new ArrayList<Double>();
        Collections.addAll(scores, 99.0, 96.0, 94.0,59.0, 66.0, 74.0);
        //成绩大于等于60的并排序
        scores.stream().filter(s -> s >= 60.0).sorted().forEach(System.out::println);//66.0 74.0 94.0 96.0 99.0
        System.out.println("--------------------------------------------");

        List<Student> students = new ArrayList<>();
        Student s1 = new Student("卡莎", 18, 99.0);
        Student s2 = new Student("泰坦", 19, 93.0);
        Student s3 = new Student("伊泽", 16, 98.0);
        Student s4 = new Student("璐璐", 14, 96.0);
        Student s5 = new Student("璐璐", 14, 96.0);
        Collections.addAll(students, s1, s2, s3, s4, s5);

        //找出年龄大于等于16 且小于等于20 按照年龄降序
        //filter() sorted()
        students.stream().filter(s -> s.getAge() >= 16 && s.getAge() <= 20).sorted(((o1, o2) -> o2.getAge() - o1.getAge()))
                .forEach(System.out::println);
        System.out.println("--------------------------------------------");

        //找出分数最高的前三名
        // sorted() limit()
        students.stream().sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore())).limit(3).forEach(System.out::println);
        System.out.println("--------------------------------------------");

        //找出分数最低的 倒数3名
        //sorted() skip()
        students.stream().sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore())).skip(students.size() - 3).forEach(System.out::println);
        System.out.println("--------------------------------------------");

        //成绩大于等于95的 去除重复的名字
        // distinct() 自定义类型 如果希望内容一样认为重复 需重写 equals()和 hashCode()
        //filter() map()  distinct()
        students.stream().filter(s -> s.getScore() >= 95).map(s -> s.getName()).distinct().forEach(System.out::println);

        students.stream().filter(s -> s.getScore() >= 95).distinct().forEach(System.out::println);

        //static <T> Stream<T> concat(Stream a, Stream b)	合并a和b两个流
        Stream<String> stream = Stream.of("1", "2", "3");
        Stream<String> stream2 = Stream.of("4", "5", "6", "7", "8", "9");
        Stream<String> stream3 = Stream.concat(stream, stream2);
        stream3.forEach(System.out::println);

}

        3. Stream流常见的终结方法

                (1) 终结方法指的是调用完成后,不会再返回新的Stream流了,不能再继续使用Stream流了。

方法名称说明
void forEach(Consumer action)对此流运算后的元素进行遍历
long count()统计此流运算后的元素个数
Optional<T> max(Comparator<? super T> copmarator)获取此流运算后的最大值元素
Optional<T> min(Comparator<? super T> copmarator)获取此流运算后的最小值元素
方法名称说明
R collect(Collector collector)把流处理后的结果放到一个指定的集合中
Object[] toArray()把流处理后的结果放到一个指定的数组中
public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student s1 = new Student("卡莎", 18, 99.0);
        Student s2 = new Student("泰坦", 19, 93.0);
        Student s3 = new Student("伊泽", 16, 98.0);
        Student s4 = new Student("璐璐", 14, 96.0);
        Student s5 = new Student("璐璐", 14, 96.0);
        Collections.addAll(students, s1, s2, s3, s4, s5);

        // 计算分数超过95的有几个 .count()
        long l = students.stream().filter(s -> s.getScore() > 95).count();
        System.out.println(l);//4

        //找出分数最高的 并输出 .max()
        Student smax = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
        System.out.println(smax);

        //找出分数最低的 并输出 .min()
        Student smin = students.stream().min((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
        System.out.println(smin);

        //计算分数超过95的 并放到一个新集合中
        //流只能收集一次

        List<Student> list1 = students.stream().filter(s -> s.getScore() > 95).collect(Collectors.toList());
        System.out.println(list1);

        Set<Student> list2 = students.stream().filter(s -> s.getScore() > 95).collect(Collectors.toSet());
        System.out.println(list2);

        //找出分数超过95的 并把名字和分数放到一个map集合中
        //不会自动去重 需调用distinct()去重
        Map<String, Double> map = students.stream().filter(s -> s.getScore() > 95).distinct().collect(Collectors.toMap(m -> m.getName(), m -> m.getScore()));
        System.out.println(map);


        //找出分数超过95的 并把名字和分数放到一个数组
        Object[] arr = students.stream().filter(s -> s.getScore() > 95).toArray();
        Student[] arr1 = students.stream().filter(s -> s.getScore() > 95).toArray(len -> new Student[len]);
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr1));
}

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

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

相关文章

庐山派K230学习日记4 PWM控制

1 本节介绍​ &#x1f4dd;本节您将学习如何通过将K230开发板的GPIO引脚复用为PWM功能并输出PWM信号&#xff1b;实现输出PWM信号及控制板载无源蜂鸣器发出声音。 &#x1f3c6;学习目标 1️⃣如何将GPIO引脚配置为PWM模式&#xff0c;通过40Pin排针中的部分引脚来输出PWM信号…

c语言的文件操作与文件缓冲区

目录 C语言文件操作函数汇总 简单介绍文件 为什么使用文件 什么是文件 文件名 二进制文件和文本文件 流和标准流 流 标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 文件的随机读写 fseek ftell rewind 文件读取结束的判定 文件缓冲区 缓…

嵌入式linux中socket控制与实现

一、概述 1、首先网络,一看到这个词,我们就会想到IP地址和端口号,那IP地址和端口各有什么作用呢? (1)IP地址如身份证一样,是标识的电脑的,一台电脑只有一个IP地址。 (2)端口提供了一种访问通道,服务器一般都是通过知名端口号来识别某个服务。例如,对于每个TCP/IP实…

Nginx:动静分离

什么是动静分离? 动静分离 是指将网站中的静态资源(如图片、样式表、脚本等)和动态内容(如 PHP、Python、Node.js 等后端生成的内容)分开部署和处理。这样做的好处是可以利用不同的服务器或缓存策略来优化不同类型的资源。 动静分离的好处 提高性能:静态资源可以直接从…

PADS Layout 差分线设计规则及其设计规则约束的详细过程步骤

一般我们的电路板有很多的差分线,有90欧姆的差分线,也有100欧姆的差分线,90欧姆的差分线主要是针对USB的差分线,特别是对于USB HUB的板子,那么我们就要设置差分线。一般我们设置差分线,一般要切换到Router里面来设置,如下所示: 那么设置差分对,一般要对原理图和Router…

计算机网络--路由表的更新

一、方法 【计算机网络习题-RIP路由表更新-哔哩哔哩】 二、举个例子 例1 例2

概述(讲讲python基本语法和第三方库)

我是北子&#xff0c;这是我自己写的python教程&#xff0c;主要是记录自己的学习成果方便自己日后复习&#xff0c; 我先学了C/C&#xff0c;所以这套教程中可能会将很多概念和C/C去对比&#xff0c;所以该教程大概不适合零基础的人。 it seems that python nowadays 只在人工…

redux用法总结

redux用法总结 目录 基本概念工作原理核心概念基本使用异步操作 Redux ThunkRedux Saga React 集成Redux Toolkit最佳实践 基本概念 什么是 Redux&#xff1f; Redux 是一个可预测的状态容器&#xff0c;用于管理 JavaScript 应用的状态。它遵循三个基本原则&#xff1a; …

Gitee上传项目代码教程(详细)

工具必备&#xff1a;Git Bash 上传步骤 1.在Gitee创建项目仓库 2.进入本地项目目录 右键打开Git Bash here 3.配置用户名和邮箱 如果之前给git配置过用户名和邮箱可跳过 查看Git是否配置成功&#xff1a;git config --list git config --global user.name "xxx"…

ARM CCA机密计算安全模型之安全生命周期管理

安全之安全(security)博客目录导读 目录 一、固件启用的调试 二、CCA系统安全生命周期 三、重新供应 四、可信子系统与CCA HES 启用 CCA&#xff08;机密计算架构&#xff09;的安全系统是指 CCA 平台的实现处于可信状态。 由于多种原因&#xff0c;CCA 启用系统可能处于不…

计算机视觉CV期末总复习

1.计算机视觉基础 数字图像表示 二值图像 仅包含黑白两种颜色的图像&#xff0c;只使用1个比特为&#xff08;0黑或1白&#xff09;表示 彩色图像&#xff1a;分不同的颜色空间 gray灰度图像 每个像素只有一个采样颜色&#xff0c;取值范围0--255&#xff0c;为8比特位&a…

web安全常用靶场

这里写自定义目录标题 phpstydy2018pikachuxss-labs phpstydy2018 网盘地址 提取码: nxnw ‌phpStudy是一款专为PHP开发者设计的集成环境工具&#xff0c;主要用于简化PHP开发环境的搭建过程。‌ 它集成了Apache、MySQL、PHP等核心组件&#xff0c;用户只需进行一次性安装&a…

每天40分玩转Django:Django实战 - 在线打印服务系统

Django实战 - 在线打印服务系统 一、系统功能概览表 模块主要功能技术要点文件上传PDF/Word文件上传、文件验证文件处理、MIME类型验证异步处理文件转换、打印队列Celery、Redis通知邮件打印状态通知、订单确认SMTP、邮件模板 二、系统架构设计 2.1 模型设计 # models.py …

WPS计算机二级•数据查找分析

听说这里是目录哦 通配符&#x1f30c;问号&#xff08;?&#xff09;星号&#xff08;*&#xff09;波形符&#xff08;~&#xff09; 排序&#x1f320;数字按大小排序以当前选定区域排序以扩展选定区域排序 文字按首字母排序 快速筛选分类数据☄️文字筛选数字筛选颜色筛选…

基于海思soc的智能产品开发(camera sensor的两种接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于嵌入式开发设备来说&#xff0c;除了图像显示&#xff0c;图像输入也是很重要的一部分。说到图像输入&#xff0c;就不得不提到camera。目前ca…

网安入门之MySQL后端基础

数据库 (Database) 数据库是指长期存储在计算机中的&#xff0c;有组织、可共享的数据集合。它通过表、列、行等结构来组织数据&#xff0c;目的是使数据可以高效存储、检索和管理。数据库通常包括多个表&#xff0c;每个表存储与特定主题或对象相关的数据 数据库管理系统 (D…

概率基本概念 --- 离散型随机变量实例

条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y&#xff0c;它们代…

w139华强北商城二手手机管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

LLM大语言模型中RAG切片阶段改进策略

切片方法的特点和示例&#xff1a; Token 切片 适合对 Token 数量有严格要求的场景&#xff0c;比如使用上下文长度较小的模型时。 示例文本&#xff1a; “LlamaIndex是一个强大的RAG框架。它提供了多种文档处理方式。用可以根据需选择合适的方法。” 使用Token切片(chunk…

Earth靶场

打开靶机后使用 arp-scan -l 查询靶机 ip 我们使用 nmap 进行 dns 解析 把这两条解析添加到hosts文件中去&#xff0c;这样我们才可以访问页面 这样网站就可以正常打开 扫描ip时候我们发现443是打开的&#xff0c;扫描第二个dns解析的443端口能扫描出来一个 txt 文件 dirsear…