Stream 的使用,我觉得使用它是非常方便的~

Java8中的Stream的汇总和分组操作~它并不难的 在前面的文章中其实大家也已经看到我使用过将数据最后汇总成一个 List 集合。但其实还可以转换成Integer、Map、Set 集合等。 阅读详情

前言

今天主要聊起的是如何使用 stream 流,关于它为什么被引入,有什么样的优势,还有一些平时未曾注意到的知识点的话,就在下一次再讲吧~

能基础的使用,是深入了解它的一个基础吧,我觉得~

在本文中,你将会看到Stream API支持的许多操作。这些操作能让你快速完成复杂的数据查询,如筛选、切片、映射、查找、匹配和归约。

一、筛选和切片

1.1、筛选 filter

filter 会接受一个 Predicate 接口的参数,其本质就是一个布尔值函数(官方称为谓词,说成白话,即为一个布尔值函数)

准备好的数据~

      static   List<Student> students = new ArrayList<>();
 ​
     static {
                students.add(new Student("学生A", "大学1", 18));
         students.add(new Student("学生A", "大学1", 18));
         students.add(new Student("学生A", "大学1", 18));
         students.add(new Student("学生A", "大学1", 18));
         students.add(new Student("学生B", "大学1", 18));
         students.add(new Student("学生C", "大学1", 19));
         students.add(new Student("学生D", "大学2", 20));
         students.add(new Student("学生E", "大学2", 21));
         students.add(new Student("学生F", "大学2", 20));
         students.add(new Student("学生G", "大学3", 22));
         students.add(new Student("学生H", "大学3", 23));
         students.add(new Student("学生I", "大学3", 19));
         students.add(new Student("学生J", "大学4", 20));
     }

1、从中筛选出小于20的学生们组成一个新的集合

jdk 8 之前的写法:

 List<Student> result = new ArrayList<>();
 for (Student student : students) {
     if (student.getAge() < 20) {
         result.add(student);
     }
 }

Jdk 8 及之后的写法:使用stream流操作

 /**
      * 选出小于20的学生组成一个集合
      *
      * @param students
      */
 private static List<Student> selectAgeLt18(List<Student> students) {
     // 最基础的写法, filter的参数是一个 Predicate,而它是一个FunctionalInterface 式的接口, 唯一的接口就是表示一个参数的谓词(布尔值函数)。
     //        List<Student> list = students.stream().filter(new Predicate<Student>() {
     //            @Override
     //            public boolean test(Student student) {
     //                return student.getAge()<20;
     //            }
     //        }).collect(Collectors.toList());
     // 因此可以简化写成 以下这种写法
     //        List<Student> list = students.stream().filter(student -> {
     //            return student.getAge() < 20;
     //        }).collect(Collectors.toList());
     //又因为filter 的参数实际上是一个lambda表达式,当只有一条返回语句时,又可以省略大括号和return
     List<Student> list = students.stream().filter(student -> student.getAge() < 20).collect(Collectors.toList());
     return list;
 }

1.2、去重 distinct

distinct()它会返回一个元素各异(根据流所生成元素的 hashCode和equals方法实现)的流。

jdk 8之前对集合的一些去重方式

 /**
      * 去重操作,去除掉数据集合中重复的数据
      */
 private static void selectSchoolRepresent(List<Student> students) {
     //         jdk 8之前的一些方式,
     //         1、set集合去重
     HashSet<Student> set = new HashSet<>();
     for (Student student : students) {
         set.add(student);
     }
     //         还可以简写成
     List<Student> newList = new ArrayList<>(new HashSet<>(students));
 ​
     //         2、 利用 list的contains() 方法
     List<Student> list = new ArrayList<>();
     for (Student student : students) {
         if(!list.contains(student)){
             list.add(student);
         }
     }
 }

Java 8 及之后使用stream中的 distinct()方法,其实咋说勒,就是方便,其他的也木有

 /**
      * 去重操作,去除掉数据集合中重复的数据
      */
 private static void selectSchoolRepresent(List<Student> students) {
     List<Student> collect = students.stream().distinct().collect(Collectors.toList());
     collect.forEach(System.out::println);
 }
 ​

1.3、切片 limit

流支持limit(n)方法,该方法会返回一个不超过给定长度的流。

如果流是有序的,则最多会返回前n个元素。无序的则不会以任何方式排序。

Jdk 8 之前的写法

 /**
      * 选出集合中前五位同学 组成一个新的集合
      *
      * @param students
      */
 private static void selectLimit(List<Student> students) {
     List<Student> list = new ArrayList<>();
     for (int i = 0; i < students.size(); i++) {
         if (i < 5) {
             list.add(students.get(i));
         }
     }
     list.forEach(System.out::println);
 }

Jdk 8的 stream 流中的 limit 的写法

 /**
      * 选出集合中前五位同学 组成一个新的集合
      *
      * @param students
      */
 private static void selectLimit(List<Student> students) {
 ​
     List<Student> collect = students.stream().limit(5).collect(Collectors.toList());
 ​
     collect.forEach(System.out::println);
 }

1.4、跳过元素 skip

流还支持skip(n)方法,返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一 个空流。

 /**
      * 从第二个同学开始组成新的集合
      *
      * @param students
      */
 private static void selectSkip(List<Student> students) {
     List<Student> collect = students.stream().skip(2).collect(Collectors.toList());
     collect.forEach(System.out::println);
     /**
          * Student(name=学生A, school=大学1, age=18, score=90.0)
          * Student(name=学生A, school=大学1, age=18, score=76.0)
          * Student(name=学生B, school=大学1, age=18, score=91.0)
          * Student(name=学生C, school=大学1, age=19, score=65.0)
          * Student(name=学生D, school=大学2, age=20, score=80.0)
          * Student(name=学生E, school=大学2, age=21, score=78.0)
          * Student(name=学生F, school=大学2, age=20, score=67.0)
          * Student(name=学生G, school=大学3, age=22, score=87.0)
          * Student(name=学生H, school=大学3, age=23, score=79.0)
          * Student(name=学生I, school=大学3, age=19, score=92.0)
          * Student(name=学生J, school=大学4, age=20, score=84.0)
          */
 }

1.5、排序 sorted

这个就是排序啦,没啥能说的啦吧~偷个懒哈

     /**
      * 给这群学生按年龄排序
      * 
      *
      * @param students
      */
     private static void sortedDemo(List<Student> students) {
         List<Student> collect = students.stream()
                 .sorted((student1, student2) -> student1.getAge() - student2.getAge())
                 .collect(Collectors.toList());
         collect.forEach(System.out::println);
 ​
         /**
          * Student(name=学生A, school=大学1, age=18, score=98.0)
          * Student(name=学生A, school=大学1, age=18, score=91.0)
          * Student(name=学生A, school=大学1, age=18, score=90.0)
          * Student(name=学生A, school=大学1, age=18, score=76.0)
          * Student(name=学生B, school=大学1, age=18, score=91.0)
          * Student(name=学生C, school=大学1, age=19, score=65.0)
          * Student(name=学生I, school=大学3, age=19, score=92.0)
          * Student(name=学生D, school=大学2, age=20, score=80.0)
          * Student(name=学生F, school=大学2, age=20, score=67.0)
          * Student(name=学生J, school=大学4, age=20, score=84.0)
          * Student(name=学生E, school=大学2, age=21, score=78.0)
          * Student(name=学生G, school=大学3, age=22, score=87.0)
          * Student(name=学生H, school=大学3, age=23, score=79.0)
          */
     }

1.6、小结与综合应用

filter 、distinct、limit、skip、sorted 对比起 Java 8 之前的一些实现,从我个人看来是方便了许多的。

如果是看起来不习惯,我觉得可以试着多用上几次,会慢慢爱上它的。

综合应用

filter 、distinct、limit、skip、sorted 这些操作,他们的执行结果的返回值仍然是 stream,所以在使用中,他们完全可以无缝链接.

如: 我要去这一群学生中找到 年龄在 20 岁以下,分数在90分以上的前3名学生。

     /**
      * 如: 我要去这一群学生中找到 年龄在 20 岁以下,分数在90分以上的前3名学生。
      *
      * @param students
      */
     private static void select(List<Student> students) {
         List<Student> collect = students.stream()
                 .filter(student -> student.getAge() < 20)
                 .filter(student -> student.getScore() > 90.0)
                 .limit(3)
                 .collect(Collectors.toList());
         collect.forEach(System.out::println);
         /**
          * Student(name=学生A, school=大学1, age=18, score=98.0)
          * Student(name=学生A, school=大学1, age=18, score=91.0)
          * Student(name=学生B, school=大学1, age=18, score=91.0)
          */
     }

二、映射 map

这个map的映射其实不光Java 有,JavaScript 也是有的,用法我感觉是一样的~

一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里,你可以从表中选 择一列。

用我个人的话来说,filter 是用来过滤元素的,而这一小节的 map 是用来创建一个新的元素。(在官方中的使用的映射一词,是因为map 会接受一个函数作为参数,并且将其映射成一个新的元素。)

可能说起来还是不如实践来的实在。

数据还是上一节造的那些数据。

如:找出集合中所有学生的姓名,去除掉重复的名称,组成一个 List 集合

 /**
      * 找出集合中所有学生的姓名,去除掉重复的名称,组成一个 List<String> 集合
      *
      * @param students
      */
 private static void selectAllStudentName(List<Student> students) {
 ​
     List<String> collect = students.stream().map(new Function<Student, String>() {
         @Override
         public String apply(Student student) {
             return student.getName();
         }
     }).distinct().collect(Collectors.toList());
 ​
     List<String> list = students.stream().map(student -> {
         return student.getName();
     }).distinct().collect(Collectors.toList());
 ​
     List<String> collect1 = students.stream()
         .map(student -> student.getName())
         .distinct()
         .collect(Collectors.toList());
     collect1.forEach(System.out::println);
 ​
     /**
          * 学生A
          * 学生B
          * 学生C
          * 学生D
          * 学生E
          * 学生F
          * 学生G
          * 学生H
          * 学生I
          * 学生J
          */
 }

三、查找和匹配

3.1、匹配 anyMatch、allMatch和noneMatch 方法

anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”

这里的谓词也就是filter那部分所说的一个 布尔值函数。

其实看到 any 的第一眼,大家也明白,任一,只有集合中含有你需要的,那就是返回 true。

     /**
      * 判断这群学生中有木有年龄大于20岁的学生
      *
      * @param students
      */
     private static void anyMatchDemo(List<Student> students) {
         boolean anyMatch = students.stream().anyMatch(student -> student.getAge() > 20);
         System.out.println(anyMatch);
         /**
          * true
          */
     }

还有 allMatch 和 noneMatch 他们都和 anyMatch 类似。

allMatch 要求全部元素都满足要求,

noneMatch 则是要求全部元素都不满足要求时返回true。

3.2、查找 findAny 与 findFirst

findAny 方法将返回当前流中的任意元素。

它的搭档一般是 filter,和 filter 使用可以实现很多操作。

如我想要当确定这群学生中有20岁以上的学生时立马返回结果。


 

 /**
      * 当确定这群学生中有20岁以上的学生时即返回。
      *
      * @param students
      */
 private static void findAnyDemo(List<Student> students) {
     Optional<Student> student1 = students.stream().filter(student -> student.getAge() > 20).findAny();
     Student student = student1.get();
     System.out.println(student);
     /**
          * Student(name=学生E, school=大学2, age=21, score=78.0)
          */
 }

这里的 Optional 是 Java 8 新增的一个 容器类,作用就是用来判断存在和不存在。也就是大家常谈到的更优雅的判空操作。

Optional 几个常见的Api

  • isPresent()将在Optional包含值的时候返回true, 否则返回false
  • ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块。
  • T get()会在值存在时返回值,否则抛出一个NoSuchElement异常。
  • T orElse(T other)会在值存在时返回值,否则返回一个默认值。

详细的用法,大家也可以去了解了解,这也是非常好用的一个东东。

findFirst 其实就是确定返回第一个元素。它也和 filter 一起搭配使用。

咋一看, findany 和 findFirst 不是一样吗,其实在你对于返回的第一个元素没有明确要求时,你可以理解成他们确实就是一样的。

但其实他们真实区别并非体现如此,而是在 stream 中的并行流中。

今天没谈这个,大家可以去了解了解,了解并行流就会和常常聊到的性能相关啦,到底那种好一些啥的~

3.3、小结

anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的短路。

就是我们刚学语法时的 && 和 || 运算符,这也算是他们在 stream 的实现。

最简单的理解方式,就是他们通过遍历,组成了一个很长很长的布尔表达式。

除去他们能实现短路操作, findAny 与 findFirst 也是同样如此,并非都需要遍历结束才会得到最终的结果。只要在其中某一次中达成条件,即可返回结果。

四、归约

官方的说法,成为归约,如果用简单的话语来说的话,可以理解为将多个东西归为一堆。

4.1、元素求和 reduce


 

     private static void reduceDemo() {
         List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
 ​
         Integer reduce = list.stream().reduce(0, (a, b) -> a + b);
         System.out.println("list集合的总和:==>" + reduce);
 ​
         Integer reduce1 = list.stream().reduce(1, (a, b) -> a * b);
         System.out.println("list集合中的元素相乘结果==>" + reduce1);
 ​
         Optional<Integer> reduce2 = list.stream().reduce((a, b) -> a + b);
         Integer integer = reduce2.get();
         System.out.println("list 集合的总和==>"+integer);
         /**
          * list集合的总和:==>55
          * list集合中的元素相乘结果==>3628800
          * list 集合的总和==>55
          */
     }
 ​

reduce接受两个参数:

一个初始值,这里是0;

一个 BinaryOperator 来将两个元素结合起来产生一个新值,BinaryOperator 也是funcational 接口,所以也可以使用lambda 表达式 lambda (a, b) -> a + b 来表示。

 Integer reduce = list.stream().reduce(0, (a, b) -> a + b);

另外还有一个重载函数,就是没有初始值版本的,它的返回值是Optional<Integer> 的容器类。

   Optional<Integer> reduce2 = list.stream().reduce((a, b) -> a + b);

最大值与最小值:

 private static void reduceDemo2(){
     List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
     Optional<Integer> max = list.stream().reduce(Integer::max);
     Optional<Integer> min = list.stream().reduce(Integer::min);
     System.out.println("max==>"+max.get());
     System.out.println("min==>"+min.get());
     /**
          * max==>10
          * min==>1
          */
 }

后记

其实 stream 的操作还有很多,这一篇算不上结束,真正意义而言,它也算不得开始。

不过谈起 stream 流,对于操作部分我倒是觉得它是最简单的模块,如果你感兴趣的话,我更建议你去深层次的思考,它为什么引入、它是为了解决什么问题而存在、lambda函数的设计、lambda 函数推导以及在此基础上有没有更优的方式。

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单) 本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。 阅读详情

相关推荐

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

Java8 Stream流

Stream流 介绍 Stream流是一种数据渠道,是用于操作数据源(集合,数组等)生成的元素序列。Stream主要用于对于集合迭代器的增强,使之能够完成更加高效的聚合操作(例如:过滤,排序,统计分组等等),或者大批量数据的操作。此外Stream流和lambda表达式的结合使用可以大大增强编码的效率,可读性很强。 注意: 流是一次性的,它自己不会存储元素 流不会改变源对象,相反,他们会返回一个持有结果的新的Strean流 流操作时延迟执行的,这就意味着他们会等到需要结果的时候才去执行 流不可以重复使用

风小猪的博客 583

手把手教你用Sentinel-1和SNAP处理InSAR数据:从下载到生成沉降图(附Python脚本)

本文详细介绍了如何使用Sentinel-1数据和SNAP软件处理InSAR数据,从下载到生成地表沉降图的全流程。通过Python脚本实现自动化处理,适用于城市扩张和地质脆弱带的地表沉降监测,提供高性价比的毫米级形变监测方案。

weixin_26800111的博客 268

Java8——Stream流详解

Stream

weixin_44863459的博客 2503

低电压高效率能源管理芯片BQ25570的基本用法及应用电路实例

BQ25570是一款低电压、高效率、集成了可编程功率追踪(MPPT)功能、BOOST升压功能和BUCK降压功能的综合型能源管理电路。冷启动工作电压为330mV,热启动工作电压为100mV。主要应用于温差发电片TEG、压电、摩擦发电和太阳能板的能量收集,也可以用于人体可穿戴自取能传感设备的能量管理。本文主要介绍了BQ25570相关参数计算、MPPT功能验证、工作逻辑和应用场景,并设计了一版测试电路,给出了不同应用需求的电路配置建议。

weixin_49213602的博客 3455

Silvaco TCAD仿真例库——肖特基二极管反向击穿特性(案例)

本文详细解析了使用Silvaco TCAD仿真例库进行肖特基二极管反向击穿特性分析的完整案例。通过构建包含浮空P型保护环的平面结构,重点阐述了针对雪崩击穿仿真的关键步骤,包括高精度网格划分、碰撞电离模型(impact selb)的启用以及反向电压的精细扫描策略。文章深入探讨了漂移区掺杂浓度、保护环设计等参数对击穿电压的影响,并提供了实用的调试心得,旨在帮助工程师精准预测和优化功率肖特基二极管的反向耐压能力。

fire9的博客 724

Java 基础篇学习 集合框架概述与Collection接口

Collection接口与Iterator接口集合框架的概述Collection 接口中方法的使用 集合框架的概述     1、集合、数组都是对多个数据进行存储操作的结构,简称Java容器。说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化层面的存储。     2.1数组在存储多个数据方面的特点:1>一旦初始化以后,其长度就确定了。2> 数组一旦定义好,其元素的类型也就确定了,只能操作指定类型的数据     2.2数组在存储多个数据方面的缺点。1>一旦初始化以后,其长度就不能改变了

瑾年的博客 299

【数字图像相关-OpenCorr学习笔记】Epipolar search原理+代码解析

OpenCorr是一个开源C++库,用于研究和开发数字图像相关(DIC)技术它提供了2D和立体声DIC的全功能模块,以及数字体积相关(DVC)。最近正在学习OpenCorr,为了更深层次地理解ICGN,我打算浅浅剖析Opencorr的代码,学习的过程中写下这篇学习笔记,以后忘记了还能回来看看。同时,作为一名在读研究生,希望能得到社区大佬的指点,以及跟同学们一起学习进步。这一期主要讲解Eipipolar search的原理,并且附上部分代码解析。

ywyywyy的博客 1358

contains方法,及重写equals&hashCode

一开始我以为,contains方法的比较是基于==的,也就是说,假设我有一个Set<String>,里面有一个"zzj"的String对象,如果我要判断"zzj"在不在这里面,实际上是做不到的,只能判断这个对象在不在这里面,但是后来无意中看到了他的规约,我发现他的等于是调用的equals方法,所以如果有如下代码—— 实际上的输出是—— 这个看似不经意的细节其实带来了很大的便捷,因为如果我们要设计一个ADT,且给出了自己设定的equals方法,那么对于此类contains方法的调用将会

whzzj_的博客 801

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4954

openbmc 支持mctp over pcie(二)

本文介绍了在OpenBMC系统中实现MCTP over PCIe的社区方案,主要针对AMD CPU和Intel CPU平台。方案基于社区开发的mctpd应用层和内核驱动,通过修改设备树(dts)配置内存区域,并编译Linux内核模块。验证时可通过查看/proc/net/protocols确认MCTP协议支持,使用ip addr命令检查mctppci0网络接口状态。相关代码和文档参考了AspeedTech和CodeConstruct的GitHub仓库。该方案为BMC作为MCTP端点提供了标准化实现方法。

wit_yuan的专栏 379

Java中Stream配合Lambda使用详解

Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找/筛选/过滤、排序、聚合和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询

qq_25775675的博客 2734

企业如何开展BI建设--指标体系建设

很多企业的数字化转型工作都是从做BI项目开始的,很多企业认为,BI就是做指标大屏,所以做了很多的驾驶舱,也做了很多指标,有从系统取的,有手工填报的,甚至手工填报的比例占到了70%,最终BI沦为了填报系统,业务认为BI就是把从线下的微信沟通转到了线上录入展示,并没有给业务代来任何提升,久而久之,BI大屏就没人关心,公司高层也认为数据都是填报的,都经过了加工处理,这种数据不可信,不能反映业务开展的实际。其实在BI系统建设之前,我们首先要做的就是要梳理企业的指标,到底我们要展示哪些指标?

263

用Stream代理bytes[]吧~

用Stream代理bytes[]吧~   网络读取需要buffer, 就是byte[]数组啦。buffer分配后占用固定内存,size设小了不够用,size设大了造成浪费并且频繁创建对性能有影响;   需要对buffer进行复用,目前了解有2种方式: 1.buffer对象池,WCF就用的此方式; 2.buffer分割,即ArraySegment&lt...

Rocky的专栏 87

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Stream】Java中List<Object>,List<~> 使用Stream函数式

【代码】【Stream】Java中List,List 使用Stream函数式。

TomPig_1024 1466

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java8 Stream详解~排序:sorted

sorted,中间操作。有两种排序: sorted():自然排序,流中元素需实现Comparable接口 sorted(Comparator com):Comparator排序器自定义排序 「案例:将员工按工资由高到低(工资一样则按年龄由大到小)排序」 public class StreamTest { public static void main(String[] args) { List<Person> personList = new ArrayList&l

小强快跑~~ 3652

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

照着敲一遍,保证你彻底掌握 Stream ~

若有收获,请记得分享和转发哦一、概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据...

IT技术精选文摘 121

Stream流儿~流儿~流儿~

给一堆名字找出来其中姓zhang的彦祖,要第二、三个人来吧practice一下(show一下my的English level)1.emm有点麻烦2.好像也没啥区别哇3. 这个怎么说呢反正你1.8以下是用不了让我们切换一个jdk1.8红了吧彦祖们再切回来,你看看不红了不红了欸~那为什么呢这是为什么呢xdm,咱也不造呀查一下哦~原来是1.9以后才发明的呀,你们知道了嘛彦祖们那让我们来完成这个题吧这点小问题难不倒彦祖们吧!那让我们用stream来试试吧。

qq_53506785的博客 218

Java8 Stream详解~筛选:filter

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。 「案例一:筛选出Integer集合中大于7的元素,并打印出来」 public class StreamTest { public static void main(String[] args) { List<Integer> list = Arrays.asList(6, 7, 3, 8, 1, 2, 9); Stream<Integer> stream = list.stream();

小强快跑~~ 8759

Java8 Stream详解~收集(collect)

collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。 1 归集(toList/toSet/toMap) 因为流不存储数据,那么在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里。toList、toSet和toMap比较常用,另外还有toCollection、toConcurrentMap等复杂一些的用法。 下面用一个案例演示toList、toSet和toMap: public class St

小强快跑~~ 4892

Java8 stream用法 ~ 实战,不理论

1

xiaozhegaa的博客 260

Java8 Stream详解~ 提取/组合

流也可以进行合并、去重、限制、跳过等操作。 public class StreamTest { public static void main(String[] args) { String[] arr1 = { "a", "b", "c", "d" }; String[] arr2 = { "d", "e", "f", "g" }; Stream<String> stream1 = Stream.of(arr1); Stream<String&gt..

小强快跑~~ 682

Java8 stream 是什么?怎么用?咋回事? 这里都有哦~

stream是什么? 表示能应用在一组元素上一次执行的操作序列。Stream让开发者能够以一种声明的方式处理数据源(集合、数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation)和大批量数据操作 (bulk data operation)。 Stream API将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含筛选、排序、聚合等,当到达终点后便得到最终的处理结果。 它有啥特点? Stream API的使用和同

Tiffany_J的博客 632

Java8 Stream详解~归约(reduce)

归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。 「案例一:求Integer集合的元素之和、乘积和最大值。」 public class StreamTest { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 3, 2, 8, 11, 4); // 求和方式1 Optional<Integer> sum =

小强快跑~~ 2713
上一篇: 【项目实战】—— SSM 图书管理系统
下一篇: Java 同步工具与组合类的线程安全性分析
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值