【日积月累】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表达式详解

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

相关推荐
闲猫2 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
修己xj2 小时前
差生文具多?我给自己改造了一款AI周计划工具
github
海石2 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石2 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
自信的未来4 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
Brookty4 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
Jerry4 小时前
LeetCode 151. 反转字符串中的单词
算法
怕孤单的草丛4 小时前
缓存管理面临的主要问题
java·数据库·缓存
阿里嘎多学长6 小时前
2026-07-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管