JAVA开发中几个常用的lambda表达式!记得收藏起来哦~

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

JAVA开发中几个常用的lambda表达式

  • 什么是lambda表达式
      • 01、使用Lambda表达式进行集合遍历
      • 02、使用Lambda表达式进行排序
      • 03、使用Lambda表达式进行映射
      • 04、使用Lambda表达式进行过滤
      • 05、使用Lambda表达式进行分组
      • 06、使用Lambda表达式进行归约
      • 07、使用Lambda表达式进行函数式接口的实现
      • 08、使用Lambda表达式进行线程的创建
      • 09、使用Lambda表达式进行Stream的流水线操作
      • 10、使用Lambda表达式进行Optional的操作
  • 总结

什么是lambda表达式

Lambda表达式是一种在许多编程语言中存在的匿名函数表达式,它可以用于创建简短的、一次性的函数。Lambda表达式通常用于函数式编程范式中,它允许开发者以更紧凑的方式定义匿名函数,而不必显式地声明函数的名称。

在一些编程语言中,比如PythonJavaC#等,Lambda表达式的一般形式为:

//java
(parameters) -> expression

//python
lambda arguments: expression

//C#
(parameters) => expression

Lambda表达式通常包含参数列表、箭头符号(->=>),以及一个表达式。这个表达式的值就是Lambda函数的返回值

下面我们就来介绍一下JAVA开发中比较常用的几个表达式:

01、使用Lambda表达式进行集合遍历

日常未使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
        for (String fruit : list) {
            System.out.println(fruit);
        }

使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(fruit -> System.out.println(fruit));

Lambda表达式使得在集合遍历和操作中可以更紧凑地定义功能性代码块,这在函数式编程风格中很常见

02、使用Lambda表达式进行排序

日常未使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});

使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
Collections.sort(list, (s1, s2) -> s1.compareTo(s2));

Collections.sort()接受一个比较器(Comparator)作为参数,Lambda表达式用于实现比较器的compare方法。

03、使用Lambda表达式进行映射

这里举例了三种映射案例,

  • 对集合中的每个元素进行映射
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用Lambda表达式映射每个元素的平方
List<Integer> squares = numbers.stream()
                              .map(x -> x * x)
                              .collect(Collectors.toList());
System.out.println(squares);
// 输出: [1, 4, 9, 16, 25]
  • 对对象集合进行映射
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用Lambda表达式映射每个字符串的长度
List<Integer> lengths = names.stream()
                            .map(String::length)
                            .collect(Collectors.toList());
System.out.println(lengths);
// 输出: [5, 3, 7]
  • 对集合中的对象属性进行映射
List<Person> people = Arrays.asList(
        new Person("Alice", 25),
        new Person("Bob", 30),
        new Person("Charlie", 22)
);

// 使用Lambda表达式映射每个人的年龄
List<Integer> ages = people.stream()
                           .map(Person::getAge)
                           .collect(Collectors.toList());
System.out.println(ages);
// 输出: [25, 30, 22]

在这些例子中,map()函数用于将集合中的每个元素按照Lambda表达式指定的映射规则进行转换。这样的映射操作使得处理集合数据变得更加简洁和灵活

04、使用Lambda表达式进行过滤

日常未使用Lambda表达式表现如下

//排除包含字母b的水果
List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = new ArrayList<String>();
for (String fruit : list) {
    if (fruit.startsWith("b")) {
        filteredList.add(fruit);
    }
}

使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = list.stream().filter(fruit -> fruit.startsWith("b")).collect(Collectors.toList());

05、使用Lambda表达式进行分组

Lambda表达式可以结合Stream API的Collectors.groupingBy操作来进行分组

  • 按元素类型进行分组
List<String> words = Arrays.asList("apple", "banana", "orange", "avocado", "blueberry", "blackberry");

Map<Integer, List<String>> groupedByLength = words.stream()
.collect(Collectors.groupingBy(String::length));

System.out.println(groupedByLength);
// 输出: {5=[apple], 6=[banana, orange], 7=[avocado], 9=[blueberry], 10=[blackberry]}
  • 按对象属性进行分组
List<Person> people = Arrays.asList(
        new Person("Alice", "Engineer"),
        new Person("Bob", "Doctor"),
        new Person("Charlie", "Engineer"),
        new Person("David", "Doctor")
);

Map<String, List<Person>> groupedByOccupation = people.stream()
.collect(Collectors.groupingBy(Person::getOccupation));

System.out.println(groupedByOccupation);
// 输出: 
//{Engineer=[Person{name='Alice', occupation='Engineer'}, Person{name='Charlie', occupation='Engineer'}],
//Doctor=[Person{name='Bob', occupation='Doctor'}, Person{name='David', occupation='Doctor'}]}

06、使用Lambda表达式进行归约

Lambda表达式可以与Stream API一起使用,通过reduce()操作进行归约。归约操作将流中的元素组合成一个单一的结果

  • 对数字列表进行求和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用Lambda表达式对数字列表进行求和
int sum = numbers.stream().reduce(0, (x, y) -> x + y);

System.out.println(sum);
// 输出: 15
  • 对字符串列表进行连接
List<String> words = Arrays.asList("Java", "Lambda", "Expression");
// 使用Lambda表达式对字符串列表进行连接
String result = words.stream().reduce("", (x, y) -> x + " " + y);

System.out.println(result.trim());
// 输出: Java Lambda Expression
  • 找到列表中的最大值
List<Integer> numbers = Arrays.asList(3, 7, 1, 9, 4);
// 使用Lambda表达式找到列表中的最大值
int max = numbers.stream().reduce(Integer::max).orElse(0);

System.out.println(max);
// 输出: 9

07、使用Lambda表达式进行函数式接口的实现

日常未使用Lambda表达式表现如下

public interface MyInterface {
    public void doSomething(String input);
}

MyInterface myObject = new MyInterface() {
    public void doSomething(String input) {
        System.out.println(input);
    }
};
myObject.doSomething("Hello World");

使用Lambda表达式表现如下

MyInterface myObject = input -> System.out.println(input);
myObject.doSomething("Hello World");

08、使用Lambda表达式进行线程的创建

在不使用Lambda表达式之前,我们通常都是这样创建线程的

Thread thread = new Thread(new Runnable() {
    public void run() {
        System.out.println("Thread is running.");
    }
});
thread.start();

使用Lambda表达式后,我们代码可以更加简化

Thread thread = new Thread(() -> System.out.println("Thread is running."));
thread.start();

再看看自定义的函数式接口

// 定义一个函数式接口
@FunctionalInterface
interface MyRunnable {
    void run();
}

public class LambdaExample {
    public static void main(String[] args) {
        // 使用Lambda表达式实现Runnable接口
        MyRunnable myRunnable = () -> System.out.println("Thread is running.");
        // 调用实现的run方法
        myRunnable.run();
    }
}

09、使用Lambda表达式进行Stream的流水线操作

日常未使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = new ArrayList<String>();
for (String fruit : list) {
    if (fruit.startsWith("a")) {
        filteredList.add(fruit.toUpperCase());
    }
}
Collections.sort(filteredList);

使用Lambda表达式表现如下

List<String> list = Arrays.asList("apple", "banana", "orange");
List<String> filteredList = list.stream().filter(fruit -> fruit.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());

10、使用Lambda表达式进行Optional的操作

在Java中 Optional 是用于处理可能为 null 的值的容器对象。使用Lambda表达式可以更方便地进行 Optional 对象的操作

日常未使用Lambda表达式表现如下

String str = "Hello World";
if (str != null) {
    System.out.println(str.toUpperCase());
}

使用Lambda表达式表现如下

Optional<String> str = Optional.ofNullable("Hello World");
str.map(String::toUpperCase).ifPresent(System.out::println);

下面我们再来列举几个Lambda表达式进行Optional操作样例

1、创建Optional对象:

Optional<String> nameOptional = Optional.of("John");
// 或者可以使用empty()创建一个空的Optional对象
Optional<String> emptyOptional = Optional.empty();

2、使用Lambda表达式进行 map 操作:

Optional<String> nameOptional = Optional.of("John");

// 使用map将Optional中的值进行转换
Optional<String> upperCaseOptional = nameOptional.map(name -> name.toUpperCase());
System.out.println(upperCaseOptional.orElse("No value"));  
// 输出: JOHN

3、使用Lambda表达式进行 filter 操作:

Optional<String> nameOptional = Optional.of("John");

// 使用filter进行条件过滤
Optional<String> filteredOptional = nameOptional.filter(name -> name.length() > 3);
System.out.println(filteredOptional.orElse("Name is too short"));  
// 输出: John

4、使用Lambda表达式进行 orElseGet 操作:

Optional<String> nameOptional = Optional.empty();
// 使用orElseGet提供默认值的计算方法
String result = nameOptional.orElseGet(() -> "Default Name");
System.out.println(result);  
// 输出: Default Name

5、使用Lambda表达式进行 ifPresent 操作:

Optional<String> nameOptional = Optional.of("John");

// 使用ifPresent在Optional有值时执行操作
nameOptional.ifPresent(name -> System.out.println("Name: " + name));  
// 输出: Name: John

上述5个例子中的Lambda表达式被用于对 Optional 对象进行 mapfilterorElseGet 等操作,以及在 ifPresent 中执行特定的操作。这使得使用 Optional 对象变得更加便捷和清晰。Lambda表达式提供了一种紧凑且易读的方式来定义 Optional 对象的转换和操作。

总结

Lambda表达式的引入使得Java语言在函数式编程方面取得了显著的进步,提升了代码的可读性、简洁性和灵活性。Lambda表达式使得Java更适用于现代软件开发中的各种编程范式和设计模式。
如果你还有更多更好的使用技巧,欢迎评论区进行交流探讨

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯知识学习] 树链

DFS序 什么是DFS序 怎么求DFS序 进入操作&#xff0c;将有计数 出&#xff1a;可以理解为&#xff0c;没有孩子可以去了&#xff08;不能&#xff0c;向下行动&#xff1a;对应于程序里的入栈&#xff09;&#xff0c;所以回到父结点&#xff08;向上行动&#xff0c;对应于程…

关于解决引用第三方依赖突然失效的问题解决办法

目录 背景回顾解决办法结果 背景 出现该问题的背景是这样的。在项目中需要支持加载pdf文档的功能。所以采取了使用第三方PDF库的方法来实现加载pdf文档。集成完后&#xff0c;功能是正常的。后来过了一段时间&#xff0c;发现加载pdf的功能不能正常使用了&#xff0c;加载不出…

聊一下JVM调优

闲聊一下&#xff1a; 这个JVM 相信大家都了解过 但是很少用这个东西 但是面试 一些高级架构师又是必问的一些问题 之前一直不了解这个东西 感觉就是面试造火箭 实际拧螺丝 用于筛选人才 毕业这么多年 也是很少接触这些 就大学的时候学过 简单了解过一些底层 &#xff0c;找工…

计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

一&#xff0c;使用 递归 计算 字符串 的 长度 1&#xff0c;题目描述 2&#xff0c;分析题目 Ⅰ&#xff0c;题目中要求除了函数的形参&#xff0c;函数中不能够使用多余的变量&#xff08;这是比较苛刻的要求&#xff09;。 Ⅱ&#xff0c;根据此&#xff0c;很自然的…

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

Ubuntu之修改时区/时间

1、查看当前时间及时区状态 sudo timedatectl status # 显示当前时区为Asia/Shanghai 2、查看当前系统时间 sudo date 3、查看当前系统时间及时区 sudo date -R # 显示当前时间及对应时区&#xff0c;时区为“0800”北京时区 4、修改硬件时间 修改日期格式&#xff1a…

Attention机制

前置知识&#xff1a;RNN&#xff0c;LSTM/GRU 提出背景 Attention模型是基于Encoder-Decoder框架提出的。Encoder-Decoder框架&#xff0c;也就是编码-解码框架&#xff0c;主要被用来处理序列-序列问题。 Encoder&#xff1a;编码器&#xff0c;将输入的序列<x1,x2,x3……

【docker】安装 Redis

查看可用的 redis版本 docker search redis拉取 redis最新镜像 docker pull redis:latest查看本地镜像 docker images创建挂在文件 mkdir -pv /test1/docker_volume/redis/datamkdir -pv /test1/docker_volume/redis/confcd /test1/docker_volume/redis/conf/touch redis.con…

Postgresql源码(119)PL/pgSQL中ExprContext的生命周期

前言 在PL/pgSQL语言中&#xff0c;执行任何SQL都需要通过SPI调用SQL层解析执行&#xff0c;例如在SQL层执行表达式的入口&#xff1a; static bool exec_eval_simple_expr(PLpgSQL_execstate *estate,PLpgSQL_expr *expr,Datum *result,bool *isNull,Oid *rettype,int32 *re…

【Kubernetes 】Kubernetes 中的资源分配:CPU/内存申请和限制的重要性

在 Kubernetes 的动态世界中,高效的资源分配对于保持应用程序的稳定性和最大化性能至关重要。此领域的关键考虑因素包括 CPU 和内存资源的申请和最大限制。 在本文中,我们将探讨正确配置这些设置的重要性以及它们对 Kubernetes 集群内工作负载管理的影响,本文大纲如下, 了…

RDS创建数据库

目录 创建数据库 创建账号与授权 连接RDS数据库 创建数据库 在创建数据库的页面&#xff0c;你需要设置数据库的名称、字符集、排序规则等信息。 字符集&#xff1a;字符集&#xff08;Character set&#xff09;是多个字符的集合&#xff0c;字符集种类较多&#xff0c;每个…

谷歌Gemini Pro模型 Api 调用

写在前面 本篇博客主要介绍如下内容 Gemini Pro模型 ApiKey的申请 Gemini Pro模型 Api调用的方法 几个模型Api调用的demo程序 调用Gemini Pro模型中可能遇到的问题及解决方案 模型 ApiKey的申请 注册好Google账号&#xff0c;并在浏览器完成登录访问 : https://makersuite.g…

向日葵远程工具安装Mysql的安装与配置

目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…

javascript之跳转页面的几种方法?

文章目录 前言代码演示及解释使用location.href属性使用location.assign()方法使用location.replace()方法使用window.open()方法使用document.URL方法 总结 前言 本章学习的是JavaScript中的跳转页面的几种方法 代码演示及解释 使用location.href属性 可以直接将一个新的URL…

HarmonyOS 路由传参

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

C#上位机与欧姆龙PLC的通信08----开发自己的通讯库读写数据

1、介绍 前面已经完成了7项工作&#xff1a; C#上位机与欧姆龙PLC的通信01----项目背景-CSDN博客 C#上位机与欧姆龙PLC的通信02----搭建仿真环境-CSDN博客 C#上位机与欧姆龙PLC的通信03----创建项目工程-CSDN博客 C#上位机与欧姆龙PLC的通信04---- 欧姆龙plc的存储区 C#上…

项目 杂碎 知识点 汇总!!!

Vue !!! setup生命周期 使用 nextTick &#xff01;&#xff01;获取节点 onMounted中可以使用JS&#xff0c;获取节点&#xff0c;setup生命周期无法获取节点 vue实现文本粘贴复制 Vue遍历对象 1、使用v-for指令&#xff1a;可以直接遍历对象的键和值 2、使用 Object.keys…

(已解决)word如何制作和引用参考文献

文章目录 正文其他 一般使用latex&#xff0c;但是有的时候会遇到使用word的情况&#xff0c;这里记录一下word如何弄参考文献。 正文 1.首先复制你的参考文献到word里面&#xff0c;然后要编号&#xff0c;记住&#xff0c;一定要编号&#xff0c;否则到时候无法引用。 那么…

深度学习|2.11 向量化vectorization

2.11 向量化的作用 向量化可以使得向量中的每一个维度的数据进行并行计算&#xff0c;从而加快了神经网络的计算速度。 验证 其他

Eureka注册及使用

一、Eureka的作用 Eureka是一个服务注册与发现的工具&#xff0c;主要用于微服务架构中的服务发现和负载均衡。其主要作用包括&#xff1a; 服务提供者将自己注册到Eureka Server上&#xff0c;包括服务的地址和端口等信息。服务消费者从Eureka Server上获取服务提供者的地址…