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

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

相关推荐
wuminyu1 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh1 小时前
SpringBoot 配置⽂件
java·spring boot·spring
ZhengEnCi2 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3272 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕2 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
三无少女指南3 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程
香蕉大香蕉(06敬畏市场)4 小时前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
nice_lcj5204 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试