java加强 -stream流

news2025/5/20 17:37:02

Stream流是jdk8开始新增的一套api,可以用于操作集合或数组的内容。

Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。

体验Stream流

把集合中所有以三开头并且三个字的元素存储到一个新集合。

package streamDemo;

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

public class StreamDemo1 {
    public static void main(String[] args) {
        //目标:认识stream流,掌握基本使用步骤,体会它的优势
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张无忌");
        list.add("张三丰");
        list.add("张小四");
        //用传统方案找出姓张的人名字为三个字的存入到新集合中
        List<String> newList = new ArrayList<>();
        for(String name : list)
        {
            if(name.startsWith("张")&&name.length()==3)
            {
                newList.add(name);
            }
        }
        System.out.println(newList);
        //用stream流
        List<String> newList2=list.stream().filter(s -> s.startsWith("张")).filter(s ->s.length()==3).collect(Collectors.toList());
        System.out.println(newList2);
    }
}

相较于传统方法的排序和筛选,stream流只需要一行就可以实现功能,代码更简洁。

获取Stream流

语法:

Stream<集合或数组内存储的数据类型> 变量名 = 数组或集合名.stream();

示例

package streamDemo;

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

public class StreamDemo2 {
    public static void main(String[] args) {
        //获取stream流的方式
        //1、获取集合的stream流,调用集合提供的stream()方法
        Collection<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();

        //2、Map集合
        Map<String,Integer> map = new HashMap<>();
        //获取它的键流
        Stream<String> s2 = map.keySet().stream();
        //值流
        Stream<Integer> s3 = map.values().stream();
        //键值对流
        Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();
        //3、数组的流
        String[] names = {"张三丰","张学友","张学良"};
        Stream<String> s5 = Arrays.stream(names);
        System.out.println(s5.count());
        Stream<String> s6 = Stream.of(names);
        Stream<String> s7 = Stream.of("张三丰", "张无忌", "张三");
    }
}

Stream流的常用中间方法

中间方法指的是,使用完这个方法后,会返回一个新的Stream流,例如筛选完姓张的人后返回一个只有姓张的人的集合用于后续操作。

获取的Stream流可以使用多个中间方法进行筛选,直到选出我们需要的数据。

常用的几种方法有:过滤方法、合并方法、映射/加工方法等

Stream流中若是需要为自定义数据类型规定排序规则/筛选规则,可以使用Lambda方法。

示例

package streamDemo;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamDemo3 {
    public static void main(String[] args) {
        //掌握Stream流常用的中间方法,对流上的数据进行处理(返回新流:支持链式存储)
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张无忌");
        list.add("张三丰");
        list.add("张小四");
        //过滤方法
        list.stream()
                .filter(s -> s.startsWith("张"))
                .filter(s ->s.length()==3)
                .forEach(s -> System.out.println(s));
        //排序方法
        List<Double> scorce = new ArrayList<>();
        scorce.add(99.8);
        scorce.add(98.7);
        scorce.add(83.7);
        scorce.add(67.5);
        scorce.add(67.5);
        scorce.stream().sorted().forEach(s-> System.out.println(s));//升序
        System.out.println("=============================");
        scorce.stream().sorted((s1,s2)->Double.compare(s2,s1))
                .forEach(s-> System.out.println(s));//降序
        System.out.println("=============================");
        scorce.stream().sorted((s1,s2)->Double.compare(s2,s1))
                .limit(2).forEach(System.out::println);//只要前两名
        System.out.println("=============================");
        scorce.stream().sorted((s1,s2)->Double.compare(s2,s1))
                .skip(2).forEach(System.out::println);//跳过前两名
        System.out.println("=============================");
        //如果希望自定义对象能够去重,需要重写对象的hashCode和equals方法才能去重
        scorce.stream().sorted((s1,s2)->Double.compare(s2,s1))
                .distinct().forEach(System.out::println);//去重

        //映射/加工方法: 把流上原本的数据拿出来变成新数据放回流上
        scorce.stream().map(s->"加十分后:"+(s+10)).forEach(System.out::println);
        //合并流
        Stream<String> s1 = Stream.of("张三丰", "张无忌", "张三");
        Stream<Integer> s2 = Stream.of(111,22,33);
        Stream<Object> s3 = Stream.concat(s1,s2);//每次只能合并两个
        System.out.println(s3.count());
    }
}

Stream流的常用终结方法

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

常用的一些终结方法有统计/收集方法。收集方法是将目前流中的数据存储到一个集合/数组中,统计方法是统计流中目前的元素数量,流中的最大值最小值等。

package streamDemo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Teacher implements Comparable<Teacher>{
    private String name;
    private int age;
    private double salary;
    @Override
    public String toString()
    {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}'+"\n";
    }
    //t2.compareTo(t1)
    //t2==this 比较者
    //t1==o 被比较者
    //规定:如果t2大于t1,返回正数;如果t2小于t1,返回负数;如果t2等于t1,返回0
    @Override
    public int compareTo(Teacher o) {
        //按照年龄升序排序
//            if (this.age>o.age)
//                return 1;
//            else if (this.age<o.age)
//                return -1;
//            return 0;
//    }
        return this.age-o.age;//升序
        //return o.age-this.age;//降序
    }
}
package streamDemo;

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

public class StreamDemo4 {
    public static void main(String[] args) {
        //掌握Stream流的统计,收集操作(终结方法)
        List<Teacher> teachers = new ArrayList<>();
        teachers.add(new Teacher("张三",18,5000));
        teachers.add(new Teacher("老陈",38,8000));
        teachers.add(new Teacher("老金",58,15000));
        teachers.add(new Teacher("老魏",63,16000));
        teachers.add(new Teacher("张五",28,3500));

        teachers.stream().filter(s->s.getSalary()>6000).forEach(s-> System.out.println(s));
        System.out.println("======================================");
        long count = teachers.stream().filter(s -> s.getSalary() > 15000).count();  //计15000薪水以上的人数
        System.out.println(count);
        System.out.println("======================================");
        //获取薪水最高的老师对象
        Optional<Teacher> max = teachers.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        Teacher maxTeacher = max.get();
        System.out.println(maxTeacher);
        //最小
        Optional<Teacher> min = teachers.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        Teacher minTeacher = min.get();
        System.out.println(minTeacher);
        System.out.println("=====================================");
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张无忌");
        list.add("张三丰");
        list.add("张小四");
        //收集到集合或数组中
        Stream<String> s1 = list.stream().filter(s->s.startsWith("张"));
        //收集到list集合
        //流只能收集一次
        List<String> List1 = s1.collect(Collectors.toList());
        System.out.println(List1);
        //收集到Set集合
        Set<String> list2 =list.stream().filter(s->s.startsWith("张")).collect(Collectors.toSet());
        System.out.println(list2);
        System.out.println("=============收集到map集合===================");
        Stream<Teacher> s4 = teachers.stream();
        //收集到Map集合:键是老师名称,值是老师薪水
        Map<String, Double> map = s4.collect(Collectors.toMap(t1 -> t1.getName(), t1 -> t1.getSalary()));
        System.out.println(map);

    }
}

以上就是关于Stream流的基本语法。

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

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

相关文章

Linux(2)——shell原理及Linux中的权限

目录 一、shell的运行原理 二、Linux中权限的问题 1.权限的概念 2.如何进行用户的切换 1&#xff09;从普通用户切到超级用户 2&#xff09;从root用户切到普通用户 3.如何实现提权操作 4.如何将普通用户添加到信用列表&#xff08;sudoers&#xff09; ​编辑5.Lin…

如何在线免费压缩PDF文档?

PDF文件太大&#xff0c;通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢&#xff0c;主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 &#xff08;一&#xff09;iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…

汽车装配又又又升级,ethernetip转profinet进阶跃迁指南

1. 场景描述&#xff1a;汽车装配线中&#xff0c;使用EtherNet/IP协议的机器人与使用PROFINET协议的PLC进行数据交互。 2. 连接设备&#xff1a;EtherNet/IP机器人控制器&#xff08;如ABB、FANUC&#xff09;与PROFINET PLC&#xff08;如西门子S7-1500&#xff09;。 3. 连…

css:无限滚动波浪线

以上是需要实现的效果&#xff0c;一条无限滚动波浪线&#xff0c;可以用来做区块的分割线。 要形成上下交替的圆形&#xff0c;思路是给div加圆角边框&#xff0c;第一个只有上边框&#xff0c;第二个只有下边框。 循环了100个div&#xff0c;这个数量根据自己容器宽度调整&…

w~自动驾驶~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…

山东大学计算机图形学期末复习整理5——CG10上

CG10上 Frenet-Serret框架 空间中一条曲线可以写成参数形式&#xff1a; C ( u ) ( x ( u ) , y ( u ) , z ( u ) ) \mathbf{C}(u) (x(u), y(u), z(u)) C(u)(x(u),y(u),z(u)) 这表示&#xff1a;当参数 u u u 变化时&#xff0c;曲线在三维空间中移动&#xff0c;生成一条轨…

STM32移植LVGL8.3 (保姆级图文教程)

目录 前言设备清单2.8寸TFT-LCD屏原理与应用1️⃣基本参数2️⃣引脚说明3️⃣程序移植4️⃣硬件接线 LVGL8.3 移植流程1️⃣硬件及平台要求2️⃣版本说明3️⃣源码下载4️⃣源码移植 工程配置修改配置文件1️⃣lvgl_config.h2️⃣适配屏幕驱动3️⃣配置输入设备(触摸功能) 提供…

虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系

虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系1.Default Pawn与Camera的关系1.1. Default Pawn 是什么&#xff1f;1.2. Default Pawn 的主要组件1.3. Default…

C++多态的详细讲解

【本节目标】 1. 多态的概念 2. 多态的定义及实现 3. 抽象类 4. 多态的原理 5. 单继承和多继承关系中的虚函数表 前言 需要声明的&#xff0c;本博客中的代码及解释都是在 vs2013 下的 x86 程序中&#xff0c;涉及的指针都是 4bytes 。 如果要其他平台下&#xff0c;部…

vue项目启动报错

vue项目启动报错 一、问题二、解决 一、问题 从vue2更换到vue3之后&#xff0c;需要将node进行版本升级&#xff0c;之后启动项目出现了下面的问题。 Uncaught Error: A route named “PageNotFound” has been added as a child of a route with the same name. Route names …

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具&#xff0c;解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;提供智能SQL审核、查询重写优化及自动化巡检功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…

Tomcat多应用部署与静态资源路径问题全解指南

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等

前言 又到熟悉的前言&#xff0c;接到个需求&#xff0c;要引入高德地图api&#xff0c;我就记录一下&#xff0c;要是有帮助记得点赞、收藏、关注&#x1f601;。 后续有时间会慢慢完善一些文章&#xff1a;&#xff08;画饼时间&#xff09; map组件自定义气泡、mark标记点…

排序算法之线性时间排序:计数排序,基数排序,桶排序详解

排序算法之线性时间排序&#xff1a;计数排序、基数排序、桶排序详解 前言一、计数排序&#xff08;Counting Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析1.4 适用场景 二、基数排序&#xff08;Radix Sort&#xff09;2.1 算法原理2…

Linux | mdadm 创建软 RAID

注&#xff1a;本文为 “Linux mdadm RAID” 相关文章合辑。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 Linux 下用 mdadm 创建软 RAID 以及避坑 喵ฅ・&#xfecc;・ฅ Oct 31, 2023 前言 linux 下组软 raid 用 mdadm 命令&#xff0c;multi…

CodeEdit:macOS上一款可以让Xcode退休的IDE

CodeEdit 是一款轻量级、原生构建的代码编辑器&#xff0c;完全免费且开源。它使用纯 swift 实现&#xff0c;而且专为 macOS 设计&#xff0c;旨在为开发者提供更高效、更可靠的编程环境&#xff0c;同时释放 Mac 的全部潜力。 Stars 数21,719Forks 数1,081 主要特点 macOS 原…

LLaMA-Factory 微调 Qwen2-7B-Instruct

一、系统环境 使用的 autoDL 算力平台 1、下载基座模型 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com # &#xff08;可选&#xff09;配置 hf 国内镜像站huggingface-cli download --resume-download shenzhi-wang/Llama3-8B-Chinese-Chat -…

mac本地docker镜像上传指定虚拟机

在Mac本地将Docker镜像上传至指定虚拟机的完整步骤 1. 在Mac本地保存Docker镜像为文件 通过docker save命令将镜像打包为.tar文件&#xff0c;便于传输至虚拟机。 # 示例&#xff1a;保存名为"my_image"的镜像到当前目录 docker save -o my_image.tar my_image:ta…

从代码学习深度学习 - 风格迁移 PyTorch版

文章目录 前言方法 (Methodology)阅读内容和风格图像预处理和后处理抽取图像特征定义损失函数内容损失 (Content Loss)风格损失 (Style Loss)全变分损失 (Total Variation Loss)总损失函数初始化合成图像训练模型总结前言 大家好!欢迎来到我们的深度学习代码学习系列。今天,…