Java8中的Stream,一行代码,让集合操作飞起来!

串口通信的性能瓶颈分析:如何提高数据吞吐量和降低延迟 摘要: 串口通信在高频或大数据场景下存在吞吐量不足、延迟高、丢帧等问题,主要瓶颈包括波特率限制、缓冲区不足、CPU轮询延迟等。优化策略包括:提升波特率至硬件上限、增大缓冲区、采用异步I/O(如ReadAsync)减少线程切换,使用二进制协议降低解析开销。实时性方面需启用硬件流控、批量发送数据,并优化线程优先级。跨平台适配需区分Windows/Linux的缓冲区设置与异步机制。性能测试可通过吞吐量、延迟及回环测试验证优化效果,核心原则是硬件匹配、异步处理、协议优化与跨平台适配。(150字) 阅读详情

简介

java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。在这里插入图片描述

Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者大批量的数据操作,提高了编程效率和代码可读性。

Stream的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

集合有两种方式生成流:

stream() − 为集合创建串行流
parallelStream() - 为集合创建并行流

上图中是Stream类的类结构图,里面包含了大部分的中间和终止操作。

中间操作主要有以下方法(此类型方法返回的都是Stream):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

终止操作主要有以下方法:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

举例说明

首先为了说明Stream对对象集合的操作,新建一个Student类(学生类),覆写了equals()和hashCode()方法

public class Student {

private Long id;

private String name;

private int age;

private String address;

public Student() {}

public Student(Long id, String name, int age, String address) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.address = address;
}

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

@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 &&
            Objects.equals(id, student.id) &&
            Objects.equals(name, student.name) &&
            Objects.equals(address, student.address);
}

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

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

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 String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

}

filter(筛选)

public static void main(String [] args) {

    Student s1 = new Student(1L, "肖战", 15, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);

    List<Student> streamStudents = testFilter(students);
    streamStudents.forEach(System.out::println);
}
/**
 * 集合的筛选
 * @param students
 * @return
 */
private static List<Student> testFilter(List<Student> students) {
    //筛选年龄大于15岁的学生

// return students.stream().filter(s -> s.getAge()>15).collect(Collectors.toList());
//筛选住在浙江省的学生
return students.stream().filter(s ->“浙江”.equals(s.getAddress())).collect(Collectors.toList());
}
运行结果:

这里我们创建了四个学生,经过filter的筛选,筛选出地址是浙江的学生集合。

map(转换)

public static void main(String [] args) {

    Student s1 = new Student(1L, "肖战", 15, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);

    testMap(students);
}

/**
 * 集合转换
 * @param students
 * @return
 */
private static void testMap(List<Student> students) {
    //在地址前面加上部分信息,只获取地址输出
    List<String> addresses = students.stream().map(s ->"住址:"+s.getAddress()).collect(Collectors.toList());
    addresses.forEach(a ->System.out.println(a));
}

运行结果

map就是将对应的元素按照给定的方法进行转换。

distinct(去重)

public static void main(String [] args) {

  testDistinct1();
}

/**
 * 集合去重(基本类型)
 */
private static void testDistinct1() {
    //简单字符串的去重
    List<String> list = Arrays.asList("111","222","333","111","222");
    list.stream().distinct().forEach(System.out::println);
}

运行结果:

public static void main(String [] args) {

  testDistinct2();
}

/**
 * 集合去重(引用对象)
 */
private static void testDistinct2() {
    //引用对象的去重,引用对象要实现hashCode和equal方法,否则去重无效
    Student s1 = new Student(1L, "肖战", 15, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    Student s5 = new Student(1L, "肖战", 15, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);
    students.add(s5);
    students.stream().distinct().forEach(System.out::println);
}

运行结果:

可以看出,两个重复的“肖战”同学进行了去重,这不仅因为使用了distinct()方法,而且因为Student对象重写了equals和hashCode()方法,否则去重是无效的。

sorted(排序)

public static void main(String [] args) {

    testSort1();
}

/**
 * 集合排序(默认排序)
 */
private static void testSort1() {
    List<String> list = Arrays.asList("333","222","111");
    list.stream().sorted().forEach(System.out::println);
}

运行结果:

public static void main(String [] args) {

    testSort2();
}

/**
 * 集合排序(指定排序规则)
 */
private static void testSort2() {
    Student s1 = new Student(1L, "肖战", 15, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);
    students.stream()
            .sorted((stu1,stu2) ->Long.compare(stu2.getId(), stu1.getId()))
            .sorted((stu1,stu2) -> Integer.compare(stu2.getAge(),stu1.getAge()))
            .forEach(System.out::println);
}

运行结果:

上面指定排序规则,先按照学生的id进行降序排序,再按照年龄进行降序排序

limit(限制返回个数)

public static void main(String [] args) {

    testLimit();
}

/**
 * 集合limit,返回前几个元素
 */
private static void testLimit() {
    List<String> list = Arrays.asList("333","222","111");
    list.stream().limit(2).forEach(System.out::println);
}

运行结果:

skip(删除元素)

public static void main(String [] args) {

    testSkip();
}

/**
 * 集合skip,删除前n个元素
 */
private static void testSkip() {
    List<String> list = Arrays.asList("333","222","111");
    list.stream().skip(2).forEach(System.out::println);
}

运行结果:

reduce(聚合)

public static void main(String [] args) {
    testReduce();
}
/**
 * 集合reduce,将集合中每个元素聚合成一条数据
 */
private static void testReduce() {
    List<String> list = Arrays.asList("欢","迎","你");
    String appendStr = list.stream().reduce("北京",(a,b) -> a+b);
    System.out.println(appendStr);
}

运行结果:

min(求最小值)

public static void main(String [] args) {
    testMin();
}

/**
 * 求集合中元素的最小值
 */
private static void testMin() {
    Student s1 = new Student(1L, "肖战", 14, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);
    Student minS = students.stream().min((stu1,stu2) ->Integer.compare(stu1.getAge(),stu2.getAge())).get();
    System.out.println(minS.toString());
}

运行结果:

上面是求所有学生中年龄最小的一个,max同理,求最大值。

anyMatch/allMatch/noneMatch(匹配)

public static void main(String [] args) {
    testMatch();
}

private static void testMatch() {
    Student s1 = new Student(1L, "肖战", 15, "浙江");
    Student s2 = new Student(2L, "王一博", 15, "湖北");
    Student s3 = new Student(3L, "杨紫", 17, "北京");
    Student s4 = new Student(4L, "李现", 17, "浙江");
    List<Student> students = new ArrayList<>();
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(s4);
    Boolean anyMatch = students.stream().anyMatch(s ->"湖北".equals(s.getAddress()));
    if (anyMatch) {
        System.out.println("有湖北人");
    }
    Boolean allMatch = students.stream().allMatch(s -> s.getAge()>=15);
    if (allMatch) {
        System.out.println("所有学生都满15周岁");
    }
    Boolean noneMatch = students.stream().noneMatch(s -> "杨洋".equals(s.getName()));
    if (noneMatch) {
        System.out.println("没有叫杨洋的同学");
    }
}

运行结果:

anyMatch:Stream 中任意一个元素符合传入的 predicate,返回 true

allMatch:Stream 中全部元素符合传入的 predicate,返回 true

noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

总结

上面介绍了Stream常用的一些方法,虽然对集合的遍历和操作可以用以前常规的方式,但是当业务逻辑复杂的时候,你会发现代码量很多,可读性很差,明明一行代码解决的事情,你却写了好几行。试试lambda表达式,试试Stream,你会有不一样的体验。
好了各位,本文到这里就结束了!如果本文有任何错误,请批评指教,不胜感激 !

整理了 1000 道 2019 年多家公司 java 面试题 400 多页 pdf 文档,还有几百页的Java核心知识点PDF。

欢迎大家领取,点击:818491202加入。验证:优快云,即可免费领取。

WINCC7.3破解文件 WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载! 立即下载

相关推荐

SPM12最新安装教程:Matlab2021a用户必看的路径配置技巧

本文为Matlab2021a用户提供SPM12的深度安装与路径配置指南。针对新版Matlab的路径管理变化,详细解析了传统方法失效的原因,并推荐通过创建startup.m文件实现SPM12路径的永久化、自动化配置,确保神经影像分析环境的稳定与高效。

weixin_29061509的博客 316

Java8 - Streams flatMap()

生成包含所有对象中所有书籍的流。过滤掉包含单词python的书,并收集一个Set以删除重复的书。可以将 2 levels Stream 转换成 1 level Stream.方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接。,这样就可以轻松地循环 Stream 并对其进行处理。将List转换为对象流,每个对象都包含一组书籍,使用。想 将 2 级 Stream 扁平化为一级,如。处理包含多个级别的 Stream ,比如。来看个简单的功能实现,以及常犯的一些错误。或将 二维数组转换为 一维数组。

小工匠 3万+

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 561

java stream flatMap的使用及个人理解

其中flatmap流中间操作api,我认为简单来说是对“集合中的集合的操作和展开”。比如说,一个对象集合里面的每个对象还有个集合对象。这时,我们如果需要对这个集合的所有对象的集合对象进行操作,那么flatmap就是一个不错的选择。这个p就是有人对象,我们把每个人对象里面的房子的集合通过map返回地址这个字符串流,就是一个展开操作,最后再收集所有人的地址流,统一返回字符串。2.接下来举个例子,比如有一群人的每个人都有多套房子,我想把这群人的所有房子的地址都去重的统计出来。再定义一个房子bigHouse类。

7071

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 383

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 363

js 判断字符串为空和不为空(两种方法)

1 判断字符串为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } (2)第二种方法 var test=""; if(!test){ alert("为空"); } 2 判断字符串不为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){ alert("为空"); } .

旭东怪的博客 7万+

SVG文件上传漏洞实战:从XSS攻击到防御策略

本文深入剖析了SVG文件上传漏洞的成因与危害,揭示了攻击者如何利用SVG的XML本质构造恶意文件,绕过常规检查实现存储型XSS攻击。文章通过实战复现演示了完整的攻击链,并提供了从严格内容检查、安全解析过滤到设置CSP策略等多层次的纵深防御方案,帮助开发者从根本上加固文件上传功能。

weixin_29230805的博客 397

Java Stream flatMap解析

运行如下代码 输出 以下代码, 等效于上面的 输出 接口的文档 可以看到demo中方法接受的实例对象以此对应的简写, 为参数, 为返回值对应demo中的代码使用String数组构建stream, 此时流类型为 用处理流内元素, 返回为, 此时流类型为 再用flatMap处理, 就是上一层流的元素类型, 扁平化后流内变为flatMap与map最直观的区别就是 flatMap返回的是, 而map是最终flatMap返回的多个流的内容被添加到一个流中...

weixin_57349625的博客 6218

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 282

手把手教你在openclaw中白嫖英伟达羊毛调用GLM5/Minimax2.1/Kimi K 2.5等模型

本文介绍如何在OpenClaw中免费调用英伟达平台的GLM5、Minimax2.1和Kimi K2.5等模型。通过在openclaw.json配置文件中添加NVIDIA的API信息,设置免费模型参数(如contextWindow和maxTokens),并执行简单命令即可切换默认模型。该方法可节省token消耗成本,最后需重启gateway使配置生效。文中还提供了使用其他API平台时的配置模板。

Science prince的博客 5103

一个示例带你掌握Java Stream中的FlatMap

一个例子解释Java Stream中的FlatMap 我们可以通过下面的例子来更好的理解flatmap的使用 首先定义两个类型 /** * 学生类 */ @Data @AllArgsConstructor public static class Student{ /** * 姓名 */ private String name; } /** * 班级类 */ @Data @AllArgsConstructor public static class MainCla

houdou2092的博客 3513

Android开发工程师(IOT)面试指南与参考答案

【摘要】绿联科技招聘Android开发工程师(IOT方向),要求5年以上Android开发经验,精通Kotlin/Java,熟悉IOT设备交互及跨平台开发。岗位职责包括客户端开发维护、技术调研及性能优化等。核心考察点包括:Kotlin协程在IOT低功耗场景的应用、多协议设备连接层设计、音视频性能优化及离线架构实现。重点技术涉及蓝牙Mesh群控、BLE功耗优化及ReactNative混合开发。需具备GooglePlay合规经验,熟悉Android13+权限管理,并能提供量化性能优化案例。

郑伟强dev的专栏 723

java8 匹配set_Java8中的Stream,一行代码,让集合操作飞起来!

简介java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者...

weixin_31766871的博客 337

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用 Java 8 中的 Stream ,可以让你写代码事半功倍

Stream 的高级示例非常丰富,本文的目的是为了让我们快速了解 Stream 功能的用法,并启发我们继续探索和深入学习。Stream 是 Java 8 中非常强大和实用的 API,它为开发人员提供了一种更加简便的方式来处理数据。希望我们通过本文的介绍和示例,可以快速上手使用 Stream,并继续深入学习和探索。

万猫学社 3629

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

stream获取list中的某个元素集合_简洁又快速地处理集合——java8 Stream(上)

Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的改变可以说是革命性的,影响足够深远,学习 Java 8 应该是 Java 开发者的必修课。今天给大家带来 Java 8 Stream 讲解,为什么直接讲这个,是因为只要你学完,立刻就能上手,并能让它在你的代码中大展身手。值得注意的是:学习 Stream 之前必须先学习 lambda 的相关知识。...

weixin_39877050的博客 4万+

Java 8 Stream Api 中的 map和 flatMap 操作

1.前言 Java 8 提供了非常好用的 Stream API ,可以很方便的操作集合。今天我们来探讨两个 Stream 中间操作 map(Function

码农小胖哥 3472

高效率!让java8的Stream对集合操作飞起来

每天早晨,干货准时奉上!本文作者:坚持就是胜利juejin.im/post/5d5e2616f265da03b638b28a简介java8 也出来好久了,接口默认方法,...

Java学习之道 2349

巧用Java8中的Stream,让集合操作飞起来!

简介 java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。 Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合...

Java笔记虾 1094

stream获取list中的某个元素集合_Java 8 Stream Api 中的新操作

点击上方☝SpringForAll社区轻松关注!及时获取有趣有料的技术文章1.前言Java 8提供了非常好用的 Stream API,可以很方便的操作集合。今天我们探讨两个Stream中间操作map和flatMap2. map 操作map操作是将流中的元素进行再次加工形成一个新流。这在开发中很有用。比如我们有一个学生集合,我们需要从中提取学生的年龄以分析学生的年龄分布...

weixin_39689506的博客 1万+

java stream findany_巧用Java8中的Stream,让集合操作飞起来!

原标题:巧用Java8中的Stream,让集合操作飞起来!作者:坚持就是胜利juejin.im/post/5d5e2616f265da03b638b28a简介java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,...

weixin_30158793的博客 1116

超高效率!使用Java8的Stream对集合进行操作

超高效率!使用Java8的Stream对集合操作飞起来 前言 今天博主将为大家分享超高效率!使用Java8的Stream对集合操作飞起来,用时最短!不喜勿喷,如有异议欢迎讨论! 有一个强大的地基才能写出健壮的程序! 简介 java8 也出来好久了,接口默认方法,lambda 表达式,函数式接口,Date API 等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下 lamb...

Mr_chen的博客 1924

Java 8中使用Stream流式处理集合

原文地址:https://mp.weixin.qq.com/s/adKZrOe6nFEmuADHijsAtA 作者:Hollis 前言 在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增、删、改、查、聚合、统计、过滤等操作。相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便捷。 不过,这一问题在Java 8中得到了改善,Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。本文就来介绍下如何使用Str

Dream_xun的专栏 5763
上一篇: 超详细Spring Boot面试问题集锦,面试 Spring Boot 再也不怕了,答案都在这里了!
下一篇: 2020年Java程序员BAT大厂实习生搬砖指南,薪资曝光!
SpringBoot_
博客等级 码龄8年 445粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值