【日积月累】Java Lambda 表达式

2024-01-04 05:20

本文主要是介绍【日积月累】Java Lambda 表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

目录

【日积月累】Java Lambda 表达式

  • 1.前言
  • 2.语法
  • 3.应用场景
    • 3.1简化匿名内部类的编写
    • 3.1简化匿名内部类的编写
    • 3.2简化集合类中的操作
    • 3.3实现函数式接口
    • 3.4简化多个方法的调用
    • 3.5简化异步编程
  • 4.总结
  • 5.参考


文章所属专区 日积月累


1.前言

Lambda表达式是一个匿名函数,也称闭包,允许把函数作为一个方法的参数,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。

2.语法

Lambda表达式是用箭头(->)定义的,后面跟着一个或多个参数列表和方法体。

(parameters) -> expression

(parameters) ->{ statements; }

parameters是一个或多个参数列表,它们是用圆括号括起来的。参数列表是用逗号分隔的参数名称和类型的列表。方法体是在箭头后面的花括号内定义的代码块。
示例:

int x = 10;
int y = 20;
int sum = (a, b) -> a + b;
System.out.println(sum(x, y)); // 输出30

3.应用场景

3.1简化匿名内部类的编写

未使用前:

// 未使用Lambda表达式简化匿名内部类
public class MyClass {public static void main(String[] args) {new Thread() {@Overridepublic void run() {System.out.println("Hello, world!");}}.start();}
}

使用之后 :

在这里插入代码片

3.1简化匿名内部类的编写

未使用前:

import java.util.ArrayList;
import java.util.List;public class AnonymousInnerClassExample {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);for (Integer i : list) {System.out.println(i);}}
}

使用之后:

import java.util.ArrayList;
import java.util.List;public class AnonymousInnerClassExample {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.forEach(System.out::println);}
}

Lambda表达式中的System.out::println是一个静态方法引用,它表示println()方法的调用。在Lambda表达式中,它被用于打印每个元素。

3.2简化集合类中的操作

public class AnonymousInnerClassExample {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.forEach(System.out::println);}
}

3.3实现函数式接口

只包含一个抽象方法的接口,就称为函数式接口。
我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以用于检测它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
定义函数式接口:

@FunctionalInterface
public interface MyFuncInterf<T> {public T getValue(String origin);
}

使用函数式接口作为方法参数:

  public String toLowerString(MyFuncInterf<String> mf,String origin){return mf.getValue(origin);}

使用Lambda表达式实现的接口作为参数传递:

 public void test(){String result = toLowerString((str)->{return str.toLowerCase();},"ABC")System.out.println(result);//结果abc}

3.4简化多个方法的调用

使用之后:

public static void main(String[] args) {String result = filter(list -> list.contains("apple"), "banana", "orange");System.out.println(result); // output: ["apple"]
}
public static <T> List<T> filter(Predicate<T> predicate, T... values) {return Arrays.stream(values).filter(predicate).collect(Collectors.toList());
}

3.5简化异步编程

使用之后:

// 使用Lambda表达式简化匿名内部类
public class MyClass {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello, world!");}};runnable.run();}
}// 使用Lambda表达式简化集合类中的操作
List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(i -> System.out.println(i * 2));// 使用Lambda表达式实现函数式接口
Supplier<String> greetingSupplier = () -> "Hello, ";
String greeting = greetingSupplier.get();// 使用Lambda表达式简化多个方法的调用
public void process(List<String> strings) {strings.forEach(string -> process(string));
}// 使用Lambda表达式简化异步编程
ExecutorService executorService = Executors.newFixedThreadPool(3);
Future<String> future1 = executorService.submit(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "Task 1 completed";
});
Future<String> future2 = executorService.submit(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Task 2 completed";
});String result1 = future1.get();
String result2 = future2.get();
System.out.println(result1 + result2);

4.总结

使用Lambda表达式可能会使代码更简洁和易读,但也可能会增加代码的复杂性,特别是在需要处理大量数据时。因此,在使用Lambda表达式和匿名内部类时,我们应该仔细考虑是否有更好的方法来实现我们的需求。

5.参考

Java Lambda 表达式
Lambda表达式超详细总结
lambda表达式详解
给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

这篇关于【日积月累】Java Lambda 表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/568281

相关文章

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对

Spring实现Bean的初始化和销毁的方式

《Spring实现Bean的初始化和销毁的方式》:本文主要介绍Spring实现Bean的初始化和销毁的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Bean的初始化二、Bean的销毁总结在前面的章节当中介绍完毕了ApplicationContext,也就

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j