【日积月累】Java Lambda 表达式

目录

【日积月累】Java Lambda 表达式


文章所属专区 日积月累


1.前言

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

2.语法

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

java 复制代码
(parameters) -> expression

java 复制代码
(parameters) ->{ statements; }

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

示例:

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

3.应用场景

3.1简化匿名内部类的编写

未使用前:

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

使用之后 :

java 复制代码
在这里插入代码片

3.1简化匿名内部类的编写

未使用前:

java 复制代码
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);
        }
    }
}

使用之后:

java 复制代码
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简化集合类中的操作

java 复制代码
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也会包含一条声明,说明这个接口是一个函数式接口。

定义函数式接口:

java 复制代码
@FunctionalInterface
public interface MyFuncInterf<T> {
   public T getValue(String origin);
}

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

java 复制代码
  public String toLowerString(MyFuncInterf<String> mf,String origin){
    return mf.getValue(origin);
  }

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

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

3.4简化多个方法的调用

使用之后:

java 复制代码
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简化异步编程

使用之后:

java 复制代码
// 使用Lambda表达式简化匿名内部类
public class MyClass {
 public static void main(String[] args) {
    Runnable runnable = new Runnable() {
      @Override
      public 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表达式详解

给个三连吧 谢谢谢谢谢谢了

相关推荐
代码雕刻家27 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain27 分钟前
算法 | 位运算(哈希思想)
算法
2402_8575893630 分钟前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰1 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没2 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
编程、小哥哥2 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
IT学长编程3 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇3 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器