Java——Stream流(2/2):Stream流的中间方法、终结方法(方法、案例演示)

news2024/11/17 8:23:22

目录

Stream流的中间方法

方法

案例演示

Stream流的终结方法

方法

案例演示1

收集

案例演示2


Stream流的中间方法

方法

  • 中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。
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两个流为一个流

案例演示

需求1:找出成绩大于等60分的数据,并升序后,再输出。

public class streamTest3 {
    public static void main(String[] args) {
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores,88.5,100.0,60.0,99.0,9.5,99.6,25.0);
        //需求1:找出成绩大于等于60分的数据,并升序后,再输出。
        scores.stream().filter(s -> s >= 60).sorted().forEach(s -> System.out.println(s));
    }
}

运行结果:

需求2:找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序输出。

public class streamTest3 {
    public static void main(String[] args) {

        List<Student> students = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 172.5,26 );
        Student s2 = new Student("蜘蛛精",172.5,26);
        Student s3 = new Student("紫霞",167.6,23);
        Student s4 = new Student("白晶晶",169.0,25);
        Student s5 = new Student("牛魔王",183.3,35);
        Student s6 = new Student("牛夫人",168.5,34);
        Collections.addAll(students,s1,s2,s3,s4,s5,s6);

        //需求2:找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序输出。
        students.stream().filter(s -> s.getAge() >= 23 && s.getAge() <= 30)
                .sorted((o1,o2) -> o2.getAge() - o1.getAge())  //重载的sort方法
                .forEach(s -> System.out.println(s));
    }
}

运行结果:

需求3:取出身高最高的前3名学生,并输出。

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

运行结果:

再简化输出语句:

需求4:取出身高倒数的2名学生

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

运行结果:

需求5:找出身高超过168的学生叫什么名字,要求去除重复的名字,再输出。

//需求5:找出身高超过168的学生叫什么名字,要求去除重复的名字,再输出。
students.stream().filter(s -> s.getHeight() > 168)
        .map(Student::getName /* s->s.getName()*/ )
        .distinct().forEach(System.out::println);

 运行结果:

concat的使用

Stream<String> st1 = Stream.of("张三","李四");
Stream<String> st2 = Stream.of("张三2","李四2","王五");
Stream<String> allSt = Stream.concat(st1,st2);
allSt.forEach(System.out::println);

运行结果:

Stream流的终结方法

方法

  • 终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。
Stream提供的常用终结方法说明
void forEach(Consumer action)对此流运算后的元素执行遍历
long count()统计此流运算后的元素个数
Optional<T> max(Comparator<? super T > comparator)获取此流运算后的最大值元素
Optional<T> min(Comparator<?  super T>  comparator)获取此流运算后的最小值元素

案例演示1

需求1:计算出身高超过168的学生有几人

public class streamTest4 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 172.5,26 );
        Student s2 = new Student("蜘蛛精",172.5,26);
        Student s3 = new Student("紫霞",167.6,23);
        Student s4 = new Student("白晶晶",169.0,25);
        Student s5 = new Student("牛魔王",183.3,35);
        Student s6 = new Student("牛夫人",168.5,34);
        Collections.addAll(students,s1,s2,s3,s4,s5,s6);

        //需求1:计算出身高超过168的学生有几人
        long size = students.stream().filter(s -> s.getHeight() > 168).count();
        System.out.println(size);
    }
}

运行结果:

需求2:请找出身高最高的学生对象,并输出

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

运行结果:

需求3:请找出身高最矮的学生对象,并输出

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

运行结果:

收集

  • 收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回。

Stream流:方便操作集合/数组的手段;集合/数组:才是开发中的目的

Stream提供的常用终结方法说明
R collect(Collector collector)把流处理后的结果收集到一个指定的集合中去
Object[] toArray()把流处理后的结果收集到一个数组中去
Collectors工具类提供了具体的收集方式说明
public static<T> Collector toList()把元素收集到List集合中
public static<T> Collector toSet()把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper)把元素收集到Map集合中

案例演示2

需求4:请找出身高超过170的学生对象,并放到一个新集合中去返回

//需求4:请找出身高超过170的学生对象,并放到一个新集合中去返回
List<Student> students1 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toList());
System.out.println(students1);
System.out.println("-----------------------");
Set<Student> students2 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toSet());
System.out.println(students2);

运行结果:

注意:流只能收集一次       (就像是水喝光了,或者是迭代器的指针指到了最后的位置)

例如:

需求5:请找出身高超过170的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回。

(需要手动去重) 

//需求5:请找出身高超过170的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回。
Map<String,Double> map =
    students.stream().filter(a -> a.getHeight() > 170)
    .distinct().collect(Collectors.toMap(a -> a.getName(),a -> a.getHeight()));
System.out.println(map);

运行结果:

Stream流收集为数组

Object[] arr1 = students.stream().filter(a -> a.getHeight() > 170).toArray();

//如果不想要Object类型,则
Student[] arr2 = students.stream().filter(a -> a.getHeight() > 170).toArray(len -> new Student[len]);
System.out.println(Arrays.toString(arr2));

运行结果:


END


学习自:黑马程序员——Java课程

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

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

相关文章

Ansible部署 之 zookeeper集群

简介 Ansible是近年来越来越火的一款轻量级运维自动化工具&#xff0c;主要功能为帮助运维实现运维工作的自动化、降低手动操作的失误、提升运维工作效率。常用于自动化部署软件、自动化配置、自动化管理&#xff0c;支持playbook编排。配置简单&#xff0c;无需安装客户端&am…

【小白专用 已验证24.5.30】ThinkPHP6 视图

ThinkPHP6 视图 模板引擎支持普通标签和XML标签方式两种标签定义&#xff0c;分别用于不同的目的 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签&#xff0c;主要完成一些逻辑判断、控制和循环输出&#xff0c;并且可扩展 c…

keil下载及安装(社区版本)

知不足而奋进 望远山而前行 目录 文章目录 前言 Keil有官方版本和社区版本&#xff0c;此文章为社区版本安装&#xff0c;仅供参考。 1.keil MDK 2.keil社区版介绍 3.keil下载 (1)打开进入登录界面 (2)点击下载,跳转到信息页面 (3)填写个人信息,点击提交 (4)点击下载…

基于web的垃圾分类回收系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;公告管理&#xff0c;运输管理&#xff0c;基础数据管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;运输管理&#xff0c;公告…

Web安全:Web体系架构存在的安全问题和解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

Python算法于强化学习库之rlax使用详解

概要 在强化学习领域,开发和测试各种算法需要使用高效的工具和库。rlax 是 Google 开发的一个专注于强化学习的库,旨在提供一组用于构建和测试强化学习算法的基础构件。rlax 基于 JAX,利用 JAX 的自动微分和加速计算功能,使得强化学习算法的实现更加高效和简洁。本文将详细…

植物大战僵尸杂交版2.0.88最新版安装包

游戏简介 游戏中独特的杂交植物更是为游戏增添了不少亮点。这些杂交植物不仅外观独特&#xff0c;而且拥有更强大的能力&#xff0c;能够帮助玩家更好地应对游戏中的挑战。玩家可以通过一定的条件和方式&#xff0c;解锁并培养这些杂交植物&#xff0c;从而不断提升自己的战斗…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 刚好项目中需要使用到分布式锁&#xff0c;记录一下Redisson是如何使用分布式…

SpringBoot+Vue幼儿园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UI 系统角色 教师用户管理员 功能截图

C++ STL - 容器

C STL&#xff08;标准模板库&#xff09;中的容器是一组通用的、可复用的数据结构&#xff0c;用于存储和管理不同类型的数据。 目录 零. 简介&#xff1a; 一 . vector&#xff08;动态数组&#xff09; 二. list&#xff08;双向链表&#xff09; 三. deque&#xff08…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

LabVIEW传感器虚拟综合实验系统

LabVIEW传感器虚拟综合实验系统 开发了一个基于LabVIEW的传感器虚拟综合实验系统&#xff0c;该系统集成了NIELVIS和CSY系列传感器实验平台&#xff0c;通过图形化编程语言进行数据处理和实验管理。系统允许用户进行多种传感器参数的测量和实验报告的自动生成&#xff0c;支持…

使用DLL还是通讯协议进行LabVIEW设备集成

在使用LabVIEW进行设备集成时&#xff0c;可以选择通过设备提供的DLL或直接使用通讯协议。选择方法取决于开发效率、性能、灵活性和维护成本等因素。本文将从这几个方面详细分析两种方法的优劣&#xff0c;帮助做出最佳决策。 分析角度 1. 开发效率&#xff1a; DLL&a…

全能大模型AIGC产品的使用体验、选择倾向与未来展望

随着人工智能技术的迅猛发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;领域正迎来前所未有的繁荣。其中&#xff0c;全能大模型产品以其强大的生成能力和广泛的应用场景&#xff0c;吸引了众多用户的关注。腾讯元宝APP的上线更是为这一领域注入了新的活力。本文…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

spring mvc 中怎样定位到请求调用的controller

前言 在java web开发过程中&#xff0c;正常情况下controller都是我们自己写的&#xff0c;我们可以很方便的定位到controller的位置。但是有些时候我们引入的其他依赖中可能也有controller&#xff0c;为了找到并方便的调试jar包中的controller&#xff0c;我们一般会进行全局…

【CMake系列】10-cmake测试集成googletest与第三方库自动化构建

cmake测试&#xff0c;使用ctest 可能不能满足我们的需求&#xff0c;需要我们使用更为强大的第三方测试框架&#xff0c;如googletest&#xff0c;完成项目中的测试工作 本篇文章将第三方测试框架 googletest&#xff0c;引入&#xff0c;同时也可以作为 关于 第三方包 自动化…

Nginx编译安装,信号,升级nginx

编译安装nginx&#xff1a;前面博客有写编译安装过程 systemctl stop firewalld setenforce 0 mkdir /data cd /data wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ yum -y install make gcc pcre-devel openssl-devel …

0基础学习区块链技术——51%攻击和双花

在《0基础学习区块链技术——分叉》一文中&#xff0c;讲解了区块链分叉相关的原因。这种分叉是CAP原则的结果&#xff0c;大部分分布式系统都会优先保证Availability&#xff08;可用性&#xff09;和Partition Tolerance&#xff08;分区容错性&#xff09;。而对于Consisten…

【spring】第二篇 bean实例化

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的 实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…