Java开发从入门到精通(二十):Java的面向对象编程OOP:Stream流

Java大数据开发和安全开发

  • (一)Java的新特性:Stream流
    • 1.1 什么是Stream?
    • 1.2 Stream流的使用步骤
    • 1.3 获取Stream流
    • 1.4 Stream流常见的中间方法
    • 1.5 Stream流常见的终结方法

(一)Java的新特性:Stream流

1.1 什么是Stream?

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

Stream流的优势:

  • Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操
    作集合或者数组中的数据,代码更简洁,可读性更好。
    在这里插入图片描述
    体验Stream流
    需求:
    把下面集合中所有以“张”开头,且是3个字的元素存储到一个新的集合。
import java.util.ArrayList;
import java.util.List;public class StreamTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");}
}

使用集合和数组的API

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

开始使用Stream流来解决这个需求

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<String> names =new ArrayList<>();Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");System.out.println(names);//开始使用Stream流来解决这个需求。List<String> list2 = names.stream().filter(s -> s.startsWith("张")).filter(a ->a.length()==3).collect(Collectors.toList());System.out.println(list2);}
}

1.2 Stream流的使用步骤

在这里插入图片描述
在这里插入图片描述

1.3 获取Stream流

  • 获取集合的Stream流

在这里插入图片描述

  • 获取 数组 的Stream流

在这里插入图片描述

  • 各种集合和数组获取Stream流的代码示例
import java.util.*;
import java.util.stream.Stream;public class StreamTest {public static void main(String[] args) {//1、如何获取List集合的Stream流?List<String> names = new ArrayList<>();Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");Stream<String> stream =names.stream(); //获取stream流// 2、如何获取Set集合的Stream流?Set<String> set = new HashSet<>();Collections.addAll(set,"刘德华","张曼玉","蜘蛛精","马德","德玛西亚");Stream<String>stream1=set.stream();  //获取stream流stream1.filter(s ->s.contains("德")).forEach(s -> System.out.println(s));// 3、如何获取Map集合的Stream流?Map<String,Double> map = new HashMap<>();map.put("古力娜扎",172.3);map.put("迪丽热巴",168.3);map.put("马尔扎哈",166.3);map.put("卡尔扎巴",168.3);Set<String> keys = map.keySet();Stream<String> ks = keys.stream(); //获取stream流 Collection<Double>values =map.values();Stream<Double>vs=values.stream();  //获取stream流Set<Map.Entry<String,Double>>entries = map.entrySet();Stream<Map.Entry<String, Double>> kvs = entries.stream();  kvs.filter(e ->e.getKey().contains("巴")).forEach(e ->System.out.println(e.getKey()+ "-->"+ e.getValue()));// 4、如何获取数组的stream流?String[] names2 ={"张翠山","东方不败","唐大山","独孤求败"};Stream<String>sl=Arrays.stream(names2); //获取stream流Stream<String>s2=Stream.of(names2); //获取stream流}
}

1.4 Stream流常见的中间方法

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

在这里插入图片描述

  • 常见的中间方法的代码示例
package com.qianxin.jihekuangjia;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamTest {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));List<Student> students =new ArrayList<>();Student s1= new Student( "蜘蛛精",26, 172.5);Student s2 = new Student( "蜘蛛精",26,172.5);Student s3 = new Student( "紫霞",23, 167.6);Student s4= new Student( "白晶晶",25,169.0);Student s5 = new Student( "牛魔王", 35,183.3);Student s6=new Student( "牛夫人",34,168.5);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()).forEach(s ->System.out.println(s));// 需求3:取出身高最高的前3名学生,并输出。students.stream().sorted((o1,o2)-> Double.compare(o2.getHeight(), o1.getHeight())).limit(3).forEach(s ->System.out.println(s));//不同写法1students.stream().sorted((o1,o2)-> Double.compare(o2.getHeight(), o1.getHeight())).limit(3).forEach(System.out::println);//不同写法2// 需求4:取出身高倒数的2名学生,并输出。students.stream().sorted((o1,o2)-> Double.compare(o2.getHeight(),o1.getHeight())).skip(students.size()-2).forEach(System.out::println);//需求5:找出身高超过168的学生叫什么名字,要求去除重复的名字,再输出。students.stream().filter(s ->s.getHeight()> 168).map(Student::getName).distinct().forEach(System.out::println);// distinct去重复,自定义类型的对象(希望内容一样就认为重复,重写hashCode,equalstudents.stream().filter(s->s.getHeight()> 168).distinct().forEach(System.out::println);Stream<String> st1 = Stream.of("张三","李四");Stream<String>st2= Stream.of("张三2","李四2","王五");Stream<String> allSt=Stream.concat(st1,st2);allSt.forEach(System.out::println);}
}
package com.qianxin.jihekuangjia;import java.util.Objects;public class Student {private String name;private int age;private double height;@Overridepublic 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(height, student.height) == 0 && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age, height);}public Student() {}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}

1.5 Stream流常见的终结方法

  • 终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了
    在这里插入图片描述
  • 常见的终结方法的代码示例
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<Student> students =new ArrayList<>();Student s1= new Student( "蜘蛛精",26, 172.5);Student s2 = new Student( "蜘蛛精",26,172.5);Student s3 = new Student( "紫霞",23, 167.6);Student s4= new Student( "白晶晶",25,169.0);Student s5 = new Student( "牛魔王", 35,183.3);Student s6=new Student( "牛夫人",34,168.5);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:请找出身高最高的学生对象,并输出。Student s = students.stream().max((o1, o2)-> Double.compare(o1.getHeight(), o2.getHeight())).get();System.out.println(s);// 需求3:请找出身高最矮的学生对象,并输出。Student ss = students.stream().min((o1,o2)-> Double.compare(o1.getHeight(), o2.getHeight())).get();System.out.println(ss);    }
}

收集Stream流的方法
收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回
Stream流:方便操作集合/数组的手段; 集合/数组:才是开发中的目的
在这里插入图片描述

import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<Student> students =new ArrayList<>();Student s1= new Student( "蜘蛛精",26, 172.5);Student s2 = new Student( "蜘蛛精",26,172.5);Student s3 = new Student( "紫霞",23, 167.6);Student s4= new Student( "白晶晶",25,169.0);Student s5 = new Student( "牛魔王", 35,183.3);Student s6=new Student( "牛夫人",34,168.5);Collections.addAll(students,s1,s2,s3,s4,s5,s6);// 需求4:请找出身高超过170的学生对象,并放到一个新集合中去返回,// 流只能收集一次。List<Student> students1 = students.stream().filter(a -> a.getHeight()> 170).collect(Collectors.toList());System.out.println(students1);Set<Student> students2 = students.stream().filter(a -> a.getHeight()> 170).collect(Collectors.toSet());System.out.println(students2);// 需求5:请找出身高超过170的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回。Map<String,Double> map =students.stream().filter(a->a.getHeight()>170).distinct().collect(Collectors.toMap(a ->a.getName(),a-> a.getHeight()));Object[] arr = students.stream().filter(a -> a.getHeight()> 170).toArray();System.out.println(Arrays.toString(arr));Student[] arr1 =students.stream().filter(a ->a.getHeight()>170).toArray(len -> new Student[len]);System.out.println(Arrays.toString(arr1));}
}

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

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

相关文章

1. 信息存储

系列文章目录 信息的表示和处理 : Information Storage&#xff08;信息存储&#xff09;Integer Representation&#xff08;整数表示&#xff09;Integer Arithmetic&#xff08;整数运算&#xff09;Floating Point&#xff08;浮点数&#xff09; 文章目录 系列文章目录前…

STM32常见调试工具介绍

STM32的常见调试工具主要包括ST-LINK、USB转TTL、USB转485以及USB转CAN。这些工具在嵌入式系统开发、调试以及通信中发挥着重要的作用。 1.ST-LINK&#xff1a; ST-LINK是STMicroelectronics公司专为其STM32系列微控制器开发的调试和编程工具。既能仿真也能将编译好的程序下载…

自动化收集Unity版本更新日志

自动化收集Unity版本更新日志 &#x1f365;功能介绍&#x1f96a;食用手册填写配置开始搜集 &#x1f368;数据展示 &#x1f365;功能介绍 &#x1f4a1;获取指定年份中所有的Unity版本更新日志。 &#x1f4a1;根据指定字符串过滤。 &#x1f4a1;.收集后自动保存成markdow…

LangChain-25 ReAct 让大模型自己思考和决策下一步 AutoGPT实现途径、AGI重要里程碑

背景介绍 大模型ReAct&#xff08;Reasoning and Acting&#xff09;是一种新兴的技术框架&#xff0c;旨在通过逻辑推理和行动序列的构建&#xff0c;使大型语言模型&#xff08;LLM&#xff09;能够达成特定的目标。这一框架的核心思想是赋予机器模型类似人类的推理和行动能…

专业140+总分410+北京理工大学826信号处理导论考研经验北理工电子信息通信工程,真题,参考书,大纲。

今年考研专业课826信号处理导论&#xff08;信号系统和数字信号处理&#xff09;140&#xff0c;总分410&#xff0c;顺利上岸&#xff01;回看去年将近一年的复习&#xff0c;还是记忆犹新&#xff0c;有不少经历想和大家分享&#xff0c;有得有失&#xff0c;希望可以对大家复…

Niobe开发板OpenHarmony内核编程开发——定时器

本示例将演示如何在Niobe Wifi IoT开发板上使用cmsis 2.0 接口进行定时器开发 Timer API分析 osTimerNew() /// Create and Initialize a timer./// \param[in] func function pointer to callback function./// \param[in] type \ref osTimerOnce …

LLM-大模型演化分支树、GPT派发展阶段及训练流程图、Infini-Transformer说明

大模型是怎么演进的&#xff1f; Encoder Only: 对应粉色分支&#xff0c;即BERT派&#xff0c;典型模型&#xff1a; BERT 自编码模型&#xff08;Autoencoder Model&#xff09;&#xff1a;通过重建句子来进行预训练&#xff0c;通常用于理解任务&#xff0c;如文本分类和阅…

2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天&#xff01;&#xff01; ———————————————————————————— b指令 标签&#xff1a;表示这条指令的名称&#xff0c;可跳转至标签 b指令&#xff1a;相当于goto&#xff0c;可随意跳转 如&#xff1a;fini…

【C++】详解类的--封装思想(让你丝滑的从C语言过度到C++!!)

目录 一、前言 二、【面向过程】 与 【面向对象】 三、结构体 与 类 &#x1f34e;C中结构体的变化 &#x1f349;C中结构体的具体使用 &#x1f350;结构体 --> 类 ✨类-----语法格式&#xff1a; ✨类的两种定义方式&#xff1a; 四、类的访问限定符及封装【⭐】 …

labview中的同步定时结构

单帧定时循环定时比较精确&#xff0c;最常用的功能还是它的定时循环功能&#xff0c;定时循环允许不连接“循环条件”端子&#xff0c;可以连接定时循环“结构名称”端子&#xff0c;通过定时结构停止函数停止循环。 例子在附件中。

Red Hat Enterprise Linux提示:正在更新Suscription Manager软件仓库,无法读取客户身份,本系统尚未在权利服务器中注册。

1、问题概述&#xff1f; 在Red Hat Enterprise Linux系统中执行sudo yum -y update命令的时候提示如下问题。 正在更新 Subscription Management 软件仓库。无法读取客户身份 本系统尚未在权利服务器中注册。可使用 subscription-manager进行注册。 错误:在"/etc/yum.r…

RMT: Retentive Networks Meet Vision Transformers学习笔记

代码地址&#xff1a;GitHub - qhfan/RMT: (CVPR2024)RMT: Retentive Networks Meet Vision Transformer 论文地址&#xff1a;https://arxiv.org/pdf/2309.11523.pdf Transformer首次出现在自然语言处理领域&#xff0c;后来迁移到计算机视觉领域&#xff0c;在视觉任务中表现…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

Form表单控件主要标签及属性。name属性,value属性,id属性详解。表单内容的传递流程,get和post数据传递样式。表单数据传递实例

form表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

ubuntu 安装java

在Ubuntu上安装Java通常有两种方式&#xff1a;使用包管理器安装默认仓库中的Java或者手动安装Oracle JDK。 使用APT包管理器安装&#xff1a; sudo apt update sudo apt install default-jdk 手动安装Oracle JDK&#xff1a; 首先&#xff0c;你需要从Oracle官网下载JDK的…

【攻防世界】bug

垂直越权IP绕过文件上传 文件上传绕过&#xff1a; 1. mime检测 2. 大小写绕过 3. 等价替换&#xff08;php5&#xff0c;php3&#xff09; 4. 利用JavaScript执行php代码&#xff08;正常的php代码会被检测到&#xff0c;所以就用JavaScript来执行&#xff09; <script lan…

记录一下MySQL8版本更改密码规则

#查看当前密码策略 show variables like validate_password%;#修改密码等级为low set global validate_password.policy LOW; #注意MySQL8版本这是点&#xff0c;不是_#修改密码长度为6 set global validate_password.length 6;#查询我的数据库中user表host和user select host,…

康耐视visionpro-CogFindCircleTool操作工具详细说明

◆CogFindCircleTool]功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 ◆CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③预期的圆弧:设置预期圆弧的…

消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测

Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 消除 BEV 空间中的跨模态冲突&#xff0c;实现 LiDAR 相机 3D 目标检测 摘要Introduction本文方法Single-Modal BEV Feature ExtractionSemantic-guided Flow-based AlignmentDissolved…

基于Spring Boot实现的图书个性化推荐系统

基于Spring Boot实现的图书个性化推荐系统 开发语言&#xff1a;Java语言 数据库&#xff1a;MySQL工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统实现 前台首页功能模块 学生注册 登录 图书信息 个人信息 管理员功能模块 学生管理界面图 图书分类管理界面图 图书信息管…