JAVA:Stream流式编程,解放你的生产力

一、函数式编程

  函数式编程(Functional Programming,简称 FP)是一种编程范式,它强调将计算视为数学函数的评估,避免改变状态以及可变数据。与过程式编程和面向对象编程不同,函数式编程强调函数的纯洁性(即无副作用)和不可变性(即数据一旦创建就不能改变)。

  在 Java 8 中,引入了函数式接口(Functional Interface)的概念,使得函数式编程在 Java 中也能得以实现。

二、函数式接口

  函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 java8引入@FunctionalInterface 注解声明该接口是一个函数式接口。

  函数式接口是Java8支持函数式编程的基础,函数式接口允许开发者使用Lambda表达式来创建其实例。

三、常见的函数接口类型

断言式接口 Predicate<T>:接收 T 对象并返回 boolean。消费型接口  Consumer<T>:接收 T 对象,不返回值。函数型接口  Function<T, R>:接收 T 对象,返回 R 对象。供给型接口  Supplier<T>:提供 T 对象(例如工厂),不接收值。UnaryOperator<T>:接收 T 对象,返回 T 对象。BinaryOperator<T>:接收两个 T 对象,返回 T 对象。

四、Lambda表达式

  Lambda表达式是Java 8中引入的一个核心特性,它允许我们以简洁、紧凑的方式表示一个匿名函数。Lambda表达式基于函数式编程的概念,允许我们定义一个接受特定参数并返回结果的函数,而无需为其指定一个名称。

  Lambda表达式可以作为方法的参数使用,这使得代码更加简洁紧凑,并为函数式编程提供了支持。

  Lambda表达式是一个对象,它必须赋给一个函数式接口,这种接口可以通过@FunctionalInterface显式指明,它只能有一个方法。

五、Stream流式编程

  Stream API是Java 8引入的一个新特性,用于处理数据集合(如List、Set等)。它提供了一种声明性、函数式的方式来处理数据,支持过滤、映射、排序、聚合等操作。 以下是一些常用的流程编程操作代码示例:

准备测试数据

public class User {private String name;private Integer age;private String grade;private Integer score;public User(String name, Integer age, String grade, Integer score) {this.name = name;this.age = age;this.grade = grade;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public Integer getScore() {return score;}public void setScore(Integer score) {this.score = score;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", grade='" + grade + '\'' +", score=" + score +'}';}
}
		User user1 = new User("张三", 6, "一年级", 70);User user2 = new User("李四", 7, "一年级", 75);User user3 = new User("王五", 7, "二年级", 80);User user4 = new User("赵六", 8, "三年级", 85);User user5 = new User("张飞", 5, "一年级", 90);List<User> userList = new ArrayList<>();userList.add(user1);userList.add(user2);userList.add(user3);userList.add(user4);userList.add(user5);

1. 遍历/匹配(foreach/find/match)

// 遍历输出数据
userList.forEach(user -> System.out.println(user));// 匹配查找第一个
Optional<User> firstUser = userList.stream().filter(user -> user.getAge() > 6).findFirst();
System.out.println(firstUser.get());// 随机匹配查找一个,parallelStream(并行流)
Optional<User> anyUser = userList.parallelStream().filter(user -> user.getAge() > 6).findAny();
System.out.println(anyUser.get());// 是否包含大于8的年龄的学生
boolean anyMatch = userList.stream().anyMatch(user -> user.getAge() > 8);
System.out.println(anyMatch);

2. map/flatMap

将流的元素映射成另一个类型

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

// 获取名称到一个新的列表中
List<String> nameList = userList.stream().map(user -> user.getName()).collect(Collectors.toList());
System.out.println(nameList);

3. filter
对流的元素过滤

// filter  获取年龄=7的学生
List<User> ageList = userList.stream().filter(user -> user.getAge() == 7).collect(Collectors.toList());
System.out.println(ageList);

4. 聚合(max/min/count)

// 年龄最大的学生
Optional<User> maxUser = userList.stream().max(Comparator.comparing(User::getAge));
System.out.println(maxUser.get());// 年龄大于6的有几个人
long count = userList.stream().filter(user -> user.getAge() > 6).count();
System.out.println(count);

5. sorted

对流的元素排序

// 按照年龄进行 排序
List<User> sortedList = userList.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
System.out.println(sortedList);// 先按照年龄排序,在按照分数排序,且排序方式使用自定义方式
List<User> sortedList2 = userList.stream().sorted((p1, p2) -> {if (p1.getAge() == p2.getAge()) {return p2.getScore() - p1.getScore();} else {return p2.getAge() - p1.getAge();}
}).collect(Collectors.toList());
System.out.println("sortedList2==" + JSONObject.toJSONString(sortedList2));

6. distinct

去除流中重复的元素

List<Integer> distinctList = userList.stream().map(User::getAge).distinct().collect(Collectors.toList());
System.out.println(distinctList);

7. reduce

对流中的元素归约操作,将每个元素合起来形成一个新的值

//分数的总合
Integer reduce = userList.stream().map(User::getScore).reduce((x, y) -> x + y).get();
System.out.println(reduce);

8. groupingBy

分组操作

// 按照年级分组
Map<String, List<User>> map1 = userList.stream().collect(Collectors.groupingBy(User::getGrade));
System.out.println("map1=" + JSONObject.toJSONString(map1));// 按照年龄段分组
Map<Integer, List<User>> map2 = userList.stream().collect(Collectors.groupingBy(user -> {if (user.getAge() <= 6) {return 1;} else if (user.getAge() == 7) {return 2;} else {return 3;}
}));
System.out.println("map2=" + JSONObject.toJSONString(map2));// 多级分组(按照年级分组之后,每个年级再按照年龄分组)
Map<String, Map<Integer, List<User>>> map3 = userList.stream().collect(Collectors.groupingBy(User::getGrade, Collectors.groupingBy(user -> {if (user.getAge() <= 6) {return 1;} else if (user.getAge() == 7) {return 2;} else {return 3;}
})));
System.out.println("map3=" + JSONObject.toJSONString(map3));

9. limit/skip

limit():截取流中前面几个元素

skip():跳过流中前面几个元素

// 从第一条数据开始,每2条出来
List<User> userList1 = userList.stream().skip(0).limit(2).collect(Collectors.toList());
System.out.println("userList1=" + JSONObject.toJSONString(userList1));

10. 两个列表取交集/并集

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
// 交集
List<Integer> list3 = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
System.out.println(list3);// 并集
List<Integer> list4 = Stream.concat(list1.stream(), list2.stream()).distinct().collect(Collectors.toList());
System.out.println(list4);

11. 根据列表中的对象某个属性进行去重

List<User> userList2 = userList.stream().collect(collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new));System.out.println("userList2=="+JSONObject.toJSONString(userList2));

以上就是使用stream进行的流式编程,希望对你能有所帮助。

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

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

相关文章

C/S、B/S架构(详解)

一、CS、BS架构定义 CS架构&#xff08;Client-Server Architecture&#xff09;是一种分布式计算模型&#xff0c;其中客户端和服务器之间通过网络进行通信。在这种架构中&#xff0c;客户端负责向服务器发送请求&#xff0c;并接收服务器返回的响应。服务器则负责处理客户端的…

浅谈RC4

一、什么叫RC4&#xff1f;优点和缺点 RC4是对称密码&#xff08;加密解密使用同一个密钥&#xff09;算法中的流密码&#xff08;一个字节一个字节的进行加密&#xff09;加密算法。 优点&#xff1a;简单、灵活、作用范围广&#xff0c;速度快 缺点&#xff1a;安全性能较差&…

网络图用什么软件绘制

1.亿图图示 2.Microsoft Visio2019 3.CAD看图 4.Draw.io 5.processOn 引用 [1]网络绘图软件 [2]https://zhuanlan.zhihu.com/p/663733462

torchvision笔记 torchvision.ops.sigmoid_focal_loss

理论部分&#xff1a;机器学习笔记&#xff1a;focal loss-CSDN博客 torchvision.ops.sigmoid_focal_loss(inputs: Tensor, targets: Tensor, alpha: float 0.25, gamma: float 2, reduction: str none) inputs每个样本的预测值targets 与 inputs 形状相同的浮点张量 存…

Pytorch编写Transformer

本文参考自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 在学习了图解Transformer以后&#xff0c;需要用Pytorch编写Transformer&#xff0c;下面是写代码的过程中的总结&#xff0c;结构根据图解Transformer进行说明。 import numpy as …

前字节员工自爆:我原腾讯一哥们,跳槽去小公司做小领导,就签了竞业,又从小公司离职去了对手公司,结果被发现了,小公司要他赔80万

“世界那么大&#xff0c;我想去看看”&#xff0c;这句曾经火遍网络的辞职宣言&#xff0c;说出了多少职场人心中的渴望。然而&#xff0c;当我们真的迈出跳槽那一步时&#xff0c;才发现&#xff0c;现实远比想象中残酷得多。 最近&#xff0c;一起前字节跳动员工爆料的事件…

年终奖发放没几天,提离职领导指责我不厚道,我该怎么办?

“年终奖都发了&#xff0c;你还跳槽&#xff1f;太不厚道了吧&#xff01;” “拿完年终奖就走人&#xff0c;这不是典型的‘骑驴找马’吗&#xff1f;” 每到岁末年初&#xff0c;关于“拿到年终奖后是否应该立即辞职”的话题总会引发热议。支持者认为&#xff0c;这是个人…

如何验证Rust中的字符串变量在超出作用域时自动释放内存?

讲动人的故事,写懂人的代码 在公司内部的Rust培训课上,讲师贾克强比较了 Rust、Java 和 C++ 三种编程语言在变量越过作用域时自动释放堆内存的不同特性。 Rust 通过所有权系统和借用检查,实现了内存安全和自动管理,从而避免了大部分内存泄漏。Rust 自动管理标准库中数据类…

【python实战】-- 计算所有csv文件指定数据并保存到新文件更新1

系列文章目录 文章目录 系列文章目录前言一、需求二、使用步骤1.源码 总结 前言 一、需求 判断所有指定文件是否重复&#xff0c;是否存在数据造假&#xff1b; 所有指定excel文件指定列求和&#xff0c;求最大值&#xff0c;保存到新excel 二、使用步骤 1.源码 代码如下&…

PID控制算法学习笔记分享

目录 一、参数设定 二、PID计算公式 三、位置式PID代码实现 四、增量式PID代码实现 五、两种控制算法的优缺点 六、PID算法的改进 一、参数设定 比例系数&#xff08;kp&#xff09;&#xff1a;P项的作用是根据当前误差的大小来产生一个控制量。它直接与误差成正比&#…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字&#xff0c;作为一种高度抽象化的符号系统&#xff0c;承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字&#xff0c;科学家们不断探索各种方法&#xff0c;以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

大模型 Scaling Law 的本质是工业化思维,Token 工厂,Token 生意

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. Scaling Law 的本质是工业化思维 我认为很多人对 Scaling Law 的理解还不够深入&#xff0c;他们仍然只是简单地认为&#xff1a;效果与参数规模成等比增长&#xff0c;目前的瓶颈应该是数据问题。…

军事人工智能的3个流派

在军事领域应用人工智能的态度大致分为三类&#xff1a;激进者、否认者、实用主义者。激进者认为&#xff0c;人工智能将彻底改变战争&#xff0c;改变战争的进行方式&#xff0c;有时甚至改变战争的性质及战争发生的原因。实用主义者认为&#xff0c;人工智能将越来越多地进入…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…

C++ Thead互斥量死锁,mutex如何防止死锁---C++11多线程快速学习

假设有两个线程 T1 和 T2&#xff0c;它们需要对两个互斥量 mtx1 和 mtx2 进行访问&#xff0c;而且需要按照以下顺序获取互斥量的所有权&#xff1a; - T1 先获取 mtx1 的所有权&#xff0c;再获取 mtx2 的所有权。 - T2 先获取 mtx2 的所有权&#xff0c;再获取 mtx1 的所有…

Error: MiniProgramError {“errno“:600009,“errMsg“:“request:fail invalid url \

vscode使用uniappvue3开发小程序&#xff0c;使用mockjs拦截接口&#xff0c;小程序报错&#xff1a; {status: 9value: "ide unknown command(empty parse result):**** }问题原因&#xff1a;mockjs不兼容微信小程序 解决办法&#xff0c;切换mockjs为better-mock npm…

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

PHP入门教程4:文件处理和表单处理

PHP入门教程4&#xff1a;文件处理和表单处理 在前几篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构、函数的使用以及数组和字符串的操作。本文将重点介绍PHP中的文件处理和表单处理&#xff0c;这些是Web开发中非常常见的任务。本文将包含以下几个部分&#xff1a; …

SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间&#xff0c;操作人员&#xff0c;更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码&#xff0c;那这个时候我们就需要使用一些通用方法&#xff0c;统一就行修改…

html中如何写一个提示框,css画一个提示框

在HTML中&#xff0c;提示框通常使用<div>元素来创建&#xff0c;然后使用CSS进行样式化。以下是一个示例&#xff0c;展示如何在HTML中写一个提示框&#xff0c;并使用CSS来设计其外观。 HTML 首先&#xff0c;创建一个HTML文件&#xff0c;其中包含一个提示框的结构&…