JDK8-2-流(2)- 流操作

news2024/9/23 11:13:36

JDK8-2-流(2)- 流操作

上篇 JDK8-2-流(1)-简介 中简单介绍了什么是流以及使用流的好处,本篇主要介绍流的操作类型以及如何操作。

如何返回一个流

① collection.stream

即调用集合 java.util.Collection 下的 stream 方法

List<String> list = Arrays.asList("a","b","c");
list.stream();

② 数组 Arrays.stream

String[] a = new String[]{"a", "b", "c"};
Arrays.stream(a);

③ Stream.of

String[] b = new String[]{"a", "b", "c"};
Stream.of(b);

这种方式与②类似,它内部也是调用 Arrays.stream 方法

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

操作流

以上篇中例子说明:

menu.stream()
    .filter(dish -> dish.getCalories() < 400)
    .sorted(Comparator.comparing(Dish::getCalories))
    .map(Dish::getName)
    .collect(Collectors.toList());

filter,sorted,map 方法称为中间操作,collect 称为终端操作

中间操作

诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。重要的是,除非流水线上触发一个终端操作,否则中间操作不会执行任何处理。

filter

过滤流中元素,保留需要的元素

Stream<T> filter(Predicate<? super T> predicate);
.filter(dish -> dish.getCalories() < 400)

map

将类型为 T 的流转换成类型为 R 的流

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

例如,将 Dish 类型的流转换成 String 类型的流

List<String> dishNames = menu.stream()
                .map(Dish::getName)
                .collect(Collectors.toList());

distinct

JDK8-2-流(2.1)- 流操作-distinct

sorted

对流中的元素排序

Stream<T> sorted(Comparator<? super T> comparator);
REPEATED_DISHES.stream()
                .sorted(Comparator.comparing(Dish::getCalories))
                .collect(Collectors.toList());

limit (截断流)

表示截断流中元素,只保留前面 maxSize 个

Stream<T> limit(long maxSize);
List<String> strList = Arrays.asList("a", "b", "c").stream().limit(1).collect(Collectors.toList());
System.out.println(strList);

结果:

[a]

skip (跳过元素)

表示跳过流中前 n 个元素,返回一个扔掉了前n个元素的流,如果流中元素不足n个,则返回一个空流。请注意,limit(n)和skip(n)是互补的!

Stream<T> skip(long n);
List<String> strList2 = Arrays.asList("a", "b", "c").stream().skip(1).collect(Collectors.toList());
System.out.println(strList2);

结果:

[b, c]

假设代码改成如下这样,跳过前 5 个元素,

List<String> strList2 = Arrays.asList("a", "b", "c").stream().skip(5).collect(Collectors.toList());

由于集合中一共只有3个元素,所以结果返回一个空的列表

[]

flatMap (流的扁平化处理)

JDK8-2-流(2.2)- 流操作-flatMap

终端操作

终端操作会从流的流水线生成结果。其结果是任何不是流的值,比如List、Integer,甚至void。

forEach

遍历流中的元素

void forEach(Consumer<? super T> action);
List<String> str = Arrays.asList("Hello", "World");
str.stream().forEach(s -> System.out.println(s));

结果:

Hello
World

count

统计流中元素个数

long count();
List<String> str = Arrays.asList("Hello", "World");
long length = str.stream().count();
System.out.println(length);

结果:

2

min

筛选出流中最小元素,入参为 Comparator ,返回一个 Optional,关于 Optional 可以参考JDK8-10-Optional(1)

Optional<T> min(Comparator<? super T> comparator);
List<Integer> numbers = Arrays.asList(3, 2, 5, 1);
Optional<Integer> optional = numbers.stream().min((Comparator.comparingInt(o -> o)));
System.out.println(optional.get());

结果:

1

max

和 min 类似,max 表示筛选出流中最大元素,入参为 Comparator ,返回一个 Optional

Optional<T> max(Comparator<? super T> comparator);
List<Integer> numbers = Arrays.asList(3, 2, 5, 1);
Optional<Integer> optional = numbers.stream().max((Comparator.comparingInt(o -> o)));
System.out.println(optional.get());

结果:

5

collect

意为将流的元素转换成集合,主要可以转换成如下三种集合:

  1. Collectors.toList() 转换成 List
  2. Collectors.toSet() 转换成 Set
  3. Collectors.toMap 转换成 Map

Collectors.toList

将字符串列表转换成 Integer 列表

List<Integer> lenList = Arrays.asList("Hello", "World")
                .stream()
                .map(String::length)
                .collect(Collectors.toList());

Collectors.toSet

将流中元素转换成 Set 集合

Set<String> strList = Arrays.asList("Hello", "World", "Hello")
        .stream()
        .collect(Collectors.toSet());
System.out.println(strList);

结果:

[Hello, World]

Collectors.toMap

将流中元素转换成 Map
如下例:
将 Dish 流中元素转成 key 为 name,value 为 type 的 Map

public static void toMapTest() {
    List<Dish> dishes = Arrays.asList(
            new Dish("chicken", false, 400, Dish.Type.MEAT),
            new Dish("chicken", false, 400, Dish.Type.MEAT),
            new Dish("french fries", true, 530, Dish.Type.OTHER));
    Map<String, String> map = dishes.stream().collect(Collectors.toMap(Dish::getName, d -> d.getType().toString()));
    System.out.println(map);
}

注意:如果程序在转换过程中发现有重复的 key 值,按照上面那种写法会报如下错误:

所以需要对 key 去重,如下:

private static <T> Predicate<T> distinctByKey(Function<? super T, String> keyExtractor) {
    Set<String> set = ConcurrentHashMap.newKeySet();
    return t -> set.add(keyExtractor.apply(t));
}

Map<String, String> map = dishes.stream()
            .filter(distinctByKey(Dish::getName))
            .collect(Collectors.toMap(Dish::getName, d -> d.getType().toString()));

打印结果:

{chicken=MEAT, french fries=OTHER}

allMatch

判断流中的元素是否都匹配某个条件

boolean allMatch(Predicate<? super T> predicate);

如下,判断数组中数字是否都为偶数:

boolean allNumbersAreEven = Arrays.asList(1, 2, 3)
                .stream()
                .allMatch(a -> a % 2 == 0);
System.out.println(allNumbersAreEven);

结果:

false

anyMatch

判断流中是否有元素满足某个条件

boolean anyMatch(Predicate<? super T> predicate);

如下,判断数组中数字是否有一个为偶数:

public static void anyMatchTest() {
    boolean allNumbersAreEven = Arrays.asList(1, 2, 3)
            .stream()
            .anyMatch(a -> a % 2 == 0);
    System.out.println(allNumbersAreEven);
}

结果:

true

noneMatch

判断流中元素是不是都不满足条件,如果都不满足则返回 true,否则返回 false

boolean noneMatch(Predicate<? super T> predicate);

如下,判断数组中数字是否都不是偶数:

public static void noneMatchTest() {
    boolean flag = Arrays.asList(1, 3, 5)
            .stream()
            .noneMatch(a -> a % 2 == 0);
    System.out.println(flag);
}

由于数组中数字都为 奇数 ,而判断条件是偶数,所以数组中没有数字满足条件,所以结果为 true :

true

findAny (查找任意元素)

返回流中任意一个元素的 Optional 包装对象

Optional<T> findAny();
Optional<Integer> optional = Arrays.asList(1, 2, 3)
        .stream()
        .findAny();
System.out.println(optional.get());

findFirst (查找第一个元素)

返回流中第一个元素的 Optional 包装对象

Optional<T> findFirst();
Optional<Integer> optional = Arrays.asList(1, 2, 3)
        .stream()
        .findFirst();
System.out.println(optional.get());

reduce (归约)

JDK8-2-流(2.3)- 流操作-reduce (归约)

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

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

相关文章

大学生如何申请一台免费服务器?

大学生如何申请一台免费服务器&#xff1f;阿里云学生服务器免费申请&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习…

【小米技术分享】MySQL:一条数据的存储之旅

大家好&#xff0c;我是你们的小米&#xff0c;一个热爱技术分享的活泼小伙伴&#xff01;今天&#xff0c;我来给大家揭开一个神秘的面纱&#xff0c;带你们深入了解一下MySQL数据库是如何保存一条数据的。 客户端 首先&#xff0c;让我们从客户端&#xff08;Client&#x…

【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【免费】【sci】考虑不同充电需求的电动汽车有序充电调度方法(含matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现sci文献《A coordinated charging scheduling method for electric vehicles considering different charging demands》&#xff0c;主要实现电动汽车协调充电调度方法&#xff0c;该方法主要有以…

如何使用PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习(DQN)智能体

强化学习&#xff08;DQN&#xff09;教程 本教程说明如何使用 PyTorch 在 OpenAI Gym 上的 CartPole-v0 任务上训练深度 Q 学习&#xff08;DQN&#xff09;智能体。 任务 智能体必须在两个动作之间做出决定-向左或向右移动推车-以便使与之相连的杆子保持直立。 您可以在 G…

存储笔记7 NAS

NAS  Describe NAS, its benefits and components  Discuss different NAS implementations  Describe NAS file-sharing protocols  Discuss NAS management options File Sharing Environment 文件系统&#xff1a;存储组织数据文件的结构化方式文件共享 网络存储…

python3GUI--图片浏览器By:PyQt5(附源码)

文章目录 一&#xff0e;前言二&#xff0e;展示1.主界面2.添加图片3.多级目录4.查看文件信息5.调整UI布局 三&#xff0e;源代码1.image_god_main_v.py2.image_god_GUI.py 四&#xff0e;总结 一&#xff0e;前言 本次使用PyQt5开发一款图片浏览器&#xff0c;本篇主要练习QD…

AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现

AIGC&#xff08;AI-Generated Content&#xff0c;AI生成内容&#xff09;是指基于生成对抗网络&#xff08;GAN&#xff09;、大型预训练模型等人工智能技术的方法&#xff0c;通过对已有数据进行学习和模式识别&#xff0c;以适当的泛化能力生成相关内容的技术。类似的概念还…

免费、不用部署SD:AI二维码制作教程

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 最近&#xff0c;风格化的AI二维码&#xff0c;应该没少见吧。生成的原理大家大概也知道&#xff0c;主要通过stable diffusion和一些插件来完成&#xff0c;但对…

【Linux】HTTPS协议

目录 &#x1f37a;前言&#x1f37b;HTTPS协议原理&#x1f380;1、概念&#x1f381;2、加密和解密&#x1f382;3、常见加密方式&#x1f341;3.1、对称加密&#x1f342;3.2、非对称加密 &#x1f383;4、数据摘要和数据指纹&#x1f364;5、HTTPS工作原理&#x1f338;5.1…

学生速看!免费领取一台阿里云服务器全流程

阿里云学生服务器优惠活动&#xff1a;高效计划&#xff0c;可以免费领取一台阿里云服务器&#xff0c;如果你是一名高校学生&#xff0c;想搭建一个linux学习环境、git代码托管服务器&#xff0c;或者创建个人博客网站记录自己的学习成长历程&#xff0c;拥有一台云服务器是很…

零基础速成simulink代码生成——简单滤波器实现2

simulink setting 找到model settings solver求解器配置 Code Generation 代码生成配置 生成代码报告 添加stateflow注释 可以将变量保存在定义的文件(选) 实践 简单一阶滤波器

鼠标键盘实验

文章目录 USB参考资料USB设备STM32F407USB 硬件连接软件移植官方HIDSTM32F4USB通信库 USB参考资料 ①《STM32F4xx中文参考手册》-第30章 全速USB on-the-go(OTG_FS) ②光盘&#xff1a;STM32参考资料:STM32 USB 学习资料-CD00289278.pdf(UM1021) ③光盘&#xff1a;STM32参考资…

Android 14 新特性:语法性别 Grammatical Gender

背景 如同汉语里的他、她、它&#xff0c;英语里的 He、She、it&#xff0c;很多语言都存在依据性别、对象不同而造成的语法差异&#xff0c;甚至不仅限于名词&#xff0c;还涉及到形容词、动词等&#xff0c;复杂得多。 而这部分语言所涉及到的人群多达 30 亿之众&#xff0…

【树形DP+可重集排列】至至子的公司排队

好屌的题 F-至至子的公司排队_牛客小白月赛55 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 其实题目问的就是&#xff0c;森林的拓扑序有几种 那么我们先去考虑一棵树的拓扑序有几种 这个可以用树形DP来解决 设dp[u]为&#xff0c;以u为根的子树的拓扑序的种类数&…

【Java】项目中大批量数据查询导致OOM

文章目录 背景内存溢出的具体原因错误模拟问题复现解决办法流式查询和分页查询的使用场景查询数据的建议 背景 项目中有时候一次性将大批量数据都查出来到内存中导致内存占用过多很可能会导致内存溢出 内存溢出的具体原因 在JVM内存结构中分为以下几个模块 程序计数器虚拟机…

SSL协议,一文带你了解

SSL简介 SSL&#xff08;Secure Sockets Layer&#xff09;是一种安全协议&#xff0c;用于保护互联网上的数据传输安全。SSL协议最初由网景公司开发&#xff0c;现在已经被TLS&#xff08;Transport Layer Security&#xff09;协议所取代。SSL协议和TLS协议都是为了保护数据传…

一文带你弄懂【时间复杂度】

文章目录 算法时间复杂度时间复杂度计算常见的时间复杂度时间复杂度的差异 总结 算法 算法&#xff08;Algorithm&#xff09;是求解一个问题需要遵循的&#xff0c;被清楚指定的简单指令的集合。 一个算法的评价主要从时间复杂度和空间复杂度来考虑。而时间复杂度是一个函数…

Netty核心技术四--Netty概述

1. 原生NIO存在的问题 NIO 的类库和 API 繁杂&#xff0c;使用麻烦&#xff1a;需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。需要具备其他的额外技能&#xff1a;要熟悉 Java 多线程编程&#xff0c;因为NIO编程涉及到Reactor模式&#xff0c;…

从tomcat说起全面理解Java web开发原理

从tomcat说起全面理解Java web开发原理 简介&#xff1a;Java开发分为Java ME&#xff0c;Java SE&#xff0c;Java EE。回顾过去这些的开发工作基本上都是围绕着Java EE的&#xff0c;在开发经历中分别经历了Java EE开发框架从jsp servlet一路经历了ssh&#xff0c; ss…