Java流Stream实战-常用api案例解析

news2024/11/15 8:31:58

本文介绍java 8 Stream流的常用高频api,通过实战级别的案例进行演示。实现结合实际业务、开发需要来应用技术,不让技术讲解枯燥无味,带来技术落地成生产力的价值。


1. 思考,stream 的多个操作,相当于几个for循环,实际执行了几次循环?

List<String> collect = strings.stream()

// peek1

.peek(e -> out.println("Original Element: " + e))

// filter

.filter(e -> e.length() > 3)

// peek2

.peek(e -> out.println("Filtered value: " + e))

//map

.map(String::toUpperCase)

//peek3

.peek(e -> out.println("Mapped value: " + e))

// collect

.collect(Collectors.toList());

2. Lambda 的 peek 和 forEach 区别

  • peek 返回值是和之前流泛型相同的流, 多用于打印中间操作时元素数据

  • forEach 没有返回值, 无法继续使用点语法操作

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 13:50

*/

public class PeekAndForEachExample {

public static void main(String[] args) {

PrintStream out = System.out;

final List<String> strings

= Arrays.asList("one", "two", "three", "four");

List<String> result = new ArrayList<>();

/**~~~~~~~重点看这里~~~~~~~~~~~~~~~~~~~~**/

for (String e : strings) {

// peek1

out.println("Original Element: " + e);

// filter

if (e.length() > 3) {

// peek2

out.println("Filtered value: " + e);

//map

e = e.toUpperCase();

//peek3

out.println("Mapped value: " + e);

// collect

result.add(e);

}

}

System.out.println("stream collect: " + result);

out.println("Final Results: " + strings);

out.println("~~~~~~~~~~~~~~~~~~~~~");

List<String> collect = strings.stream()

// peek1

.peek(e -> out.println("Original Element: " + e))

// filter

.filter(e -> e.length() > 3)

// peek2

.peek(e -> out.println("Filtered value: " + e))

//map

.map(String::toUpperCase)

//peek3

.peek(e -> out.println("Mapped value: " + e))

// collect

.collect(Collectors.toList());

System.out.println("stream collect: " + collect);

out.println("Final Results: " + strings);

}

}

3. Reduce用法之BigDecimal求和

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 16:46

*/

public class ReduceExample {

public static void main(String[] args) {

List<BigDecimal> list = new ArrayList<>();

list.add(BigDecimal.valueOf(1.1));

list.add(BigDecimal.valueOf(1.2));

list.add(BigDecimal.valueOf(1.3));

list.add(BigDecimal.valueOf(1.4));

BigDecimal decimal = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

System.out.println("reduce: " + decimal);

DoubleSummaryStatistics doubleSummaryStatistics = list.stream().mapToDouble(o -> o.doubleValue()).summaryStatistics();

System.out.println("doubleSummaryStatistics: " + doubleSummaryStatistics.getAverage());

System.out.println("doubleSummaryStatistics: " + doubleSummaryStatistics.getSum());

}

}

4 map 和 flatMap用法

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 17:21

*/

public class MapAndFlatMapExample {

public static void main(String[] args) {

UserAbAutoHandinDo do1 = UserAbAutoHandinDo.builder().list(Arrays.asList(1, 2, 3)).build();

UserAbAutoHandinDo do2 = UserAbAutoHandinDo.builder().list(Arrays.asList(4, 5, 6)).build();

UserAbAutoHandinDo do3 = UserAbAutoHandinDo.builder().list(Arrays.asList(7, 8, 9)).build();

UserAbAutoHandinDo do4 = UserAbAutoHandinDo.builder().list(Arrays.asList(10, 11, 12)).build();

List<UserAbAutoHandinDo> userAbAutoHandinDos = Arrays.asList(do1, do2, do3, do4);

userAbAutoHandinDos.stream().map(o -> o.getList());

Stream<Integer> integerStream = userAbAutoHandinDos.stream().flatMap(o -> o.getList().stream());

System.out.println(integerStream.collect(Collectors.toList()));

String[] strings = {"Hello", "World"};

List<String> collect = Arrays.stream(strings)

.map(str -> str.split(""))

.flatMap(splitArray -> Arrays.stream(splitArray))

.collect(Collectors.toList());

System.out.println(collect);

}

}

5. sortedExample

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 17:21

*/

public class SortedExample {

public static void main(String[] args) {

UserAbAutoHandinDo do1 = UserAbAutoHandinDo.builder().list(Arrays.asList(1, 2, 3)).build();

UserAbAutoHandinDo do2 = UserAbAutoHandinDo.builder().list(Arrays.asList(4, 5, 6)).build();

UserAbAutoHandinDo do3 = UserAbAutoHandinDo.builder().list(Arrays.asList(7, 8, 9)).build();

UserAbAutoHandinDo do4 = UserAbAutoHandinDo.builder().list(Arrays.asList(10, 11, 12)).build();

List<UserAbAutoHandinDo> userAbAutoHandinDos = Arrays.asList(do1, do2, do3, do4);

System.out.println("~~~~~~~没有短路操作不执行~~~~");

userAbAutoHandinDos.stream().sorted((x, y) -> x.getList().get(0).compareTo(y.getList().get(0))).peek(

o -> System.out.println(o.getList().get(0))

);

System.out.println("~~~~~~~有短路操作执行~~~~Comparator.comparing(keySelector)");

userAbAutoHandinDos.stream().sorted(Comparator.comparing(x -> x.getList().get(0)))

.peek(o -> System.out.println(o.getList().get(0)))

.collect(Collectors.toList());

System.out.println("~~~~~乱序之后~~有短路操作执行~~~~Comparator.comparing(keySelector)");

userAbAutoHandinDos = Arrays.asList(do1, do4, do2, do3);

userAbAutoHandinDos.stream().sorted(Comparator.comparing(x -> x.getList().get(0))).peek(

o -> System.out.println(o.getList().get(0))

).collect(Collectors.toList());

}

}

6 Collecotrs之toMap 和 groupingBy

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 17:53

*/

public class CollectorsExample1 {

public static void main(String[] args) {

UserAbAutoHandinDo do1 = UserAbAutoHandinDo.builder().userId("aaaa").list(Arrays.asList(1, 2, 3)).build();

UserAbAutoHandinDo do2 = UserAbAutoHandinDo.builder().userId("bbbb").list(Arrays.asList(4, 5, 6)).build();

UserAbAutoHandinDo do3 = UserAbAutoHandinDo.builder().userId("cccc").list(Arrays.asList(7, 8, 9)).build();

UserAbAutoHandinDo do4 = UserAbAutoHandinDo.builder().userId("dddd").list(Arrays.asList(10, 11, 12)).build();

System.out.println("~~~~~~~maxBy~~~~");

List<UserAbAutoHandinDo> userAbAutoHandinDos = Arrays.asList(do1, do2, do3, do4);

Optional<UserAbAutoHandinDo> collect = userAbAutoHandinDos.stream().collect(Collectors.maxBy(Comparator.comparing(x -> x.getList().get(0))));

System.out.println(collect.get().getList());

System.out.println("~~~~~~~ToMap~~~~");

Map<Integer, String> collect2 = userAbAutoHandinDos.stream().collect(Collectors

.toMap(x -> x.getList().get(0) % 2, //keyMapper

x -> x.getUserId(), // valueMapper

(x, y) -> x + "+" + y) // mergeFunction

);

System.out.println(JSON.toJSONString(collect2, true));

System.out.println("~~~~~~~groupingBy~~~~");

Map<Integer, List<UserAbAutoHandinDo>> collect1 = userAbAutoHandinDos.stream().collect(Collectors

.groupingBy(x -> x.getList().get(0) % 2));

System.out.println(JSON.toJSONString(collect1, true));

}

}

~~~~~~~maxBy~~~~

[10, 11, 12]

~~~~~~~ToMap~~~~

{

0:"bbbb+dddd",

1:"aaaa+cccc"

}

~~~~~~~groupingBy~~~~

{

"0": [

{

"list": [

4,

5,

6

],

"userId": "bbbb"

},

{

"list": [

10,

11,

12

],

"userId": "dddd"

}

],

"1": [

{

"list": [

1,

2,

3

],

"userId": "aaaa"

},

{

"list": [

7,

8,

9

],

"userId": "cccc"

}

]

}

7. Collectors之partitionBy

/**

* @author zhangcq

* @version 1.0.0

* @title

* @date 2022/6/9 17:53

*/

public class CollectorsExample2 {

public static void main(String[] args) {

UserAbAutoHandinDo do1 = UserAbAutoHandinDo.builder().userId("aaaa").list(Arrays.asList(1, 2, 3)).build();

UserAbAutoHandinDo do2 = UserAbAutoHandinDo.builder().userId("bbb").list(Arrays.asList(4, 5, 6)).build();

UserAbAutoHandinDo do3 = UserAbAutoHandinDo.builder().userId("ccc").list(Arrays.asList(7, 8, 9)).build();

UserAbAutoHandinDo do4 = UserAbAutoHandinDo.builder().userId("dddd").list(Arrays.asList(10, 11, 12)).build();

System.out.println("~~~~~~~partitioningBy~~~~");

List<UserAbAutoHandinDo> userAbAutoHandinDos = Arrays.asList(do1, do2, do3, do4);

Map<Boolean, Map<Integer, List<UserAbAutoHandinDo>>> collect = userAbAutoHandinDos.stream().collect(Collectors.partitioningBy(o -> o.getUserId().length() > 3, Collectors.groupingBy(o -> o.getList().get(0) % 2))

);

System.out.println(JSON.toJSONString(collect, true));

}

}

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

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

相关文章

resultMap 用法?工作中是怎么实现“多表联查”的?

目录 一、resultMap用法 1.1、使用场景 1.2、用法说明 1.2.1、模拟场景 1.2.2、使用 二、多表联查 2.1、分析 2.2、具体步骤 2.3、总结 一、resultMap用法 1.1、使用场景 字段名称和程序中的属性名不同的情况&#xff0c;可使⽤ resultMap 配置映射&#xff1b;⼀对⼀…

英语好不好,不影响做外贸

对于国际贸易而言&#xff0c;英语到底有多重要&#xff1f;还记得我刚去墨西哥的时候&#xff0c;怕语言不通&#xff0c;我还带了一本《西班牙语入门》的书籍&#xff0c;靠着那本书一边说一边学&#xff0c;刚开始的时候很痛苦的。无法想象一个国家大部分的人都不懂得讲英语…

【已解决】nvidia-smi不显示正在使用GPU的进程

目录1 问题背景2 问题探索3 问题解决4 告别Bug1 问题背景 环境&#xff1a; 远程服务器Ubuntu20.04CUDA 11.6 现象&#xff1a;在日志文件和终端均显示Python脚本已使用了GPU 但是nvidia-smi中的Processes进程无显示 2 问题探索 首先&#xff0c;可以看到 | 0 Tesla V…

Android Handler机制(三) Looper源码分析

一. 简介 我们接上一篇文章:Android Handler机制(二) Handler 实现原理 继续分析Looper Looper 的职责很单一&#xff0c;就是单纯的从 MessageQueue 中取出消息分发给消息对应 的宿主 Handler&#xff0c;因此它的代码不多(400行左右) . Looper 是线程独立的且每个线程只能存在…

MySQL运维知识

1 日志1.1 错误日志1.2 二进制日志查看二进制日志&#xff1a;mysqlbinlog ./binlog.000007purge master logs to binlog.000006reset mastershow variables like %binlog_expire_logs_seconds%默认二进制文件只存放30天&#xff0c;30天后会自动删除。1.3 查询日志1.4 慢查询日…

React(四):事件总线、setState的细节、PureComponent、ref

React&#xff08;四&#xff09;一、事件总线二、关于setState的原理1.setState的三种使用方式&#xff08;1&#xff09;基本使用&#xff08;2&#xff09;传入一个回调&#xff08;3&#xff09;第一个参数是对象&#xff0c;第二个参数是回调2.为什么setState要设置成异步…

Android kotlin实战之协程suspend详解与使用

前言 Kotlin 是一门仅在标准库中提供最基本底层 API 以便各种其他库能够利用协程的语言。与许多其他具有类似功能的语言不同&#xff0c;async 与 await 在 Kotlin 中并不是关键字&#xff0c;甚至都不是标准库的一部分。此外&#xff0c;Kotlin 的 挂起函数 概念为异步操作提供…

π型滤波器 计算_π型滤波电路

滤波器在功率和音频电子中常用于滤除不必要的频率。而电路设计中&#xff0c;基于不同应用有着许多不同种类的滤波器&#xff0c;但它们的基本理念都是一致的&#xff0c;那就是移除不必要的信号。所有滤波器都可以被分为两类&#xff0c;有源滤波器和无源滤波器。有源滤波器用…

重新认识 Java 中的内存映射(mmap)

mmap 基础概念 mmap 是一种内存映射文件的方法&#xff0c;即将一个文件映射到进程的地址空间&#xff0c;实现文件磁盘地址和一段进程虚拟地址的映射。实现这样的映射关系后&#xff0c;进程就可以采用指针的方式读写操作这一段内存&#xff0c;而系统会自动回写脏页到对应的文…

电源程控软件下载安装教程

软件&#xff1a;电源程控软件NS-PowerSupply 语言&#xff1a;简体中文 环境&#xff1a;NI-VISA 安装环境&#xff1a;Win10以上版本&#xff08;特殊需求请后台私信联系客服&#xff09; 硬件要求&#xff1a;CPU2GHz 内存4G(或更高&#xff09;硬盘500G(或更高&#xf…

2023年2月安全事件盘点

一、基本信息 2023年2月安全事件共造成约3796万美元损失&#xff0c;相较于上个月&#xff0c;安全事件数量与损失金额都有显著上升&#xff0c;其中Platypus Finance闪电贷攻击为单次利用损失之最高达850万美元。本月RugPull数量基本与上月持平&#xff0c;损失金额占比显著降…

网站打不开数据库错误等常见问题解决方法

1、“主机开设成功&#xff01;”上传数据后显示此内容&#xff0c;是因为西部数码默认放置的index.htm内容&#xff0c;需要核实wwwroot目录里面是否有自己的程序文件&#xff0c;可以删除index.htm。 2、恭喜&#xff0c;lanmp安装成功&#xff01;这个页面是wdcp的默认页面&…

用 Real-ESRGAN 拯救座机画质,自制高清版动漫资源

内容一览&#xff1a;Real-ESRGAN 是 ESRGAN 升级之作&#xff0c;主要有三点创新&#xff1a;提出高阶退化过程模拟实际图像退化&#xff0c;使用光谱归一化 U-Net 鉴别器增加鉴别器的能力&#xff0c;以及使用纯合成数据进行训练。 关键词&#xff1a;Real-ESRGAN 超分辨率 视…

一文彻底搞懂cookie、session、token、jwt!

前言 随着Web应用程序的出现&#xff0c;直接在客户端上存储用户信息的需求也随之出现。者背后的想象时合法的&#xff1a;与特定用户相关的信息都应该保存在用户的机器上。无论是登录信息、个人偏好、还是其他数据&#xff0c;Web应用程序提供者都需要有办法 将他们保存在客户…

电子技术——CMOS 逻辑门电路

电子技术——CMOS 逻辑门电路 在本节我们介绍如何使用CMOS电路实现组合逻辑函数。在组合电路中&#xff0c;电路是瞬时发生的&#xff0c;也就是电路的输出之和当前的输入有关&#xff0c;并且电路是无记忆的也没有反馈。组合电路被大量的使用在当今的数字逻辑系统中。 晶体管…

Educational Codeforces Round 144 (Rated for Div. 2)(A~C)

A. Typical Interview Problem从1开始&#xff0c;遇到3的倍数就在字符串后面加F&#xff0c;遇到5的倍数就在字符串后面加B&#xff0c;若遇到3和5的倍数&#xff0c;就加入FB&#xff0c;这样可以写一个无限长的字符串&#xff0c;给出一个长度最多为10的字符串&#xff0c;判…

CLion+Opencv+QT开发相关

一、QT安装和配置其实我并没有直接在Qt上开发&#xff0c;下载Qt而是因为&#xff1a;CLion可以通过Qt的MinGW作为Toolset&#xff0c;并且可以将Qt creator作为external tool&#xff1b;在进行Opencv的编译安装中可以用Qt自带的MinGW进行编译和安装&#xff0c;不用另外下载M…

C++类和对象:初始化列表、static成员和友元

目录 一. 初始化列表 1.1 对象实例化时成员变量的创建及初始化 1.2 初始化列表 1.3 使用初始化列表和在函数体内初始化成员变量的效率比较 1.4 成员变量的初始化顺序 1.5 explicit关键字 二. static成员 2.1 static属性的成员变量 2.2 static属性的成员函数 三. 友元 …

废气处理设备远程监控

当今工业迅速的发展&#xff0c;工业带给人们的经济效益显著&#xff0c;而同时污染问题也备受关注。国家环保标准对排放至大气的废气指标提出了更高的要求。面临着环保压力&#xff0c;企业为走可持续发展之路&#xff0c;为维护员工利益、改善工作环境及周边环境不受影响&…

一、Sping框架引入

OCP开闭原则 什么是OCP&#xff1f; OCP是软件七大开发原则当中最基本的一个原则&#xff1a;开闭原则 对什么开&#xff1f;对扩展开放。 对什么闭&#xff1f;对修改关闭。OCP原则是最核心的&#xff0c;最基本的&#xff0c;其他的六个原则都是为这个原则服务的。OCP开闭原则…