java中Lambda表达式的用法

        Java中的Lambda表达式是一种简洁的表示匿名方法的方式,它允许你以更简洁的形式实现只有一个抽象方法的接口(这种接口被称为函数式接口)。Lambda表达式从Java 8开始引入,极大地简化了集合操作、事件处理、多线程等场景下的代码编写。

1、Lambda表达式的基本语法

1.Lambda表达式的基本语法如下:

(参数列表) -> { 方法体 }
  • 参数列表:与函数式接口中抽象方法的参数列表一致。如果参数列表中只有一个参数,那么圆括号可以省略。如果方法体只有一条语句,大括号和花括号也可以省略。
  • 箭头(->):分隔参数列表和方法体。
  • 方法体:实现了函数式接口中抽象方法的方法体。

2.用法 

假设我们有一个函数式接口Greeting,它包含一个抽象方法greet,该方法接受一个String类型的参数并返回一个String类型的结果。

@FunctionalInterface  
interface Greeting {  
    String greet(String name);  
}

使用Lambda表达式实现这个接口并调用greet方法: 

public class LambdaExample {  
    public static void main(String[] args) {  
        Greeting greeting = (String name) -> "Hello, " + name + "!";  
          
        String result = greeting.greet("World");  
        System.out.println(result); // 输出:Hello, World!  
    }  
}

这个代码的意思式Lambda表达式(String name) -> "Hello, " + name + "!"是一个匿名函数,它实现了Greeting接口的greet方法。当调用greeting.greet("World")时,Lambda表达式被执行,并返回字符串"Hello, World!"

你们看使用Lambda表达式的方式使得代码更加简洁,特别是当接口的实现非常简单时。此外,它还使得代码更加灵活,因为你可以在不同的地方以不同的方式实现同一个接口,而无需创建多个匿名内部类。

2、结合Stream API的例子

假设我们有一个List<String>,想要找出其中所有的大写字符串并打印出来:

import java.util.Arrays;  
import java.util.List;  
import java.util.stream.Collectors;  
  
public class StreamExample {  
    public static void main(String[] args) {  
        List<String> strings = Arrays.asList("Java", "python", "C++", "Scala", "JavaScript");  
  
        // 使用Stream API和Lambda表达式找出所有大写字符串  
        List<String> upperCaseStrings = strings.stream()  
                .filter(s -> s.equals(s.toUpperCase())) // 过滤出所有大写字符串  
                .collect(Collectors.toList()); // 收集结果  
  
        upperCaseStrings.forEach(System.out::println); // 打印结果  
    }  
}

这个例子展示了Lambda表达式与Stream API结合使用的强大功能,能够以非常简洁的方式完成复杂的集合操作。

不使用Lambda表达式:

import java.util.Arrays;  
import java.util.Collections;  
import java.util.List;  
import java.util.stream.Collectors;  
  
public class StreamExampleWithoutLambda {  
    public static void main(String[] args) {  
        List<String> strings = Arrays.asList("Java", "python", "C++", "Scala", "JavaScript");  
  
        // 使用Stream API和匿名内部类找出所有大写字符串  
        List<String> upperCaseStrings = strings.stream()  
                .filter(new java.util.function.Predicate<String>() {  
                    @Override  
                    public boolean test(String s) {  
                        return s.equals(s.toUpperCase());  
                    }  
                })  
                .collect(Collectors.toList());  
  
        // 打印结果  
        for (String str : upperCaseStrings) {  
            System.out.println(str);  
        }  
  
      
    }  
}

3、Lambda表达式什么时候用 

那这么好用的Lambda表达式在什么情况使用呢? 

  1. 集合操作
    • 在处理集合(如List、Set)时,Lambda表达式经常与Stream API一起使用,以进行过滤、映射、排序等操作。例如,使用filtermapsorted等方法时,可以传入Lambda表达式作为参数。
  2. 线程操作
    • 在使用java.util.concurrent包中的线程池(如ExecutorService)时,可以通过Lambda表达式来定义要执行的任务。例如,使用submit方法提交一个Callable或Runnable任务时,可以使用Lambda表达式。
  3. 事件监听
    • 在某些框架或库中,事件监听器可能通过函数式接口实现。使用Lambda表达式可以方便地定义事件处理逻辑,而无需实现完整的监听器类。
  4. Comparator接口
    • 在需要对集合进行排序时,可以使用Lambda表达式来定义Comparator。这使得排序逻辑更加清晰和简洁。
  5. 函数式接口回调
    • 在需要传递函数作为参数或返回值时,如果这个函数可以用一个接口来定义(且该接口是函数式接口),那么就可以使用Lambda表达式来简化代码。
  6. 替代匿名内部类
    • 在Java 8之前,实现一个接口(特别是只有一个方法的接口)的匿名内部类是一种常见的做法。Lambda表达式提供了一种更简洁的替代方案。
  7. 并行处理
    • 在使用Stream API进行并行处理时,Lambda表达式使得并行逻辑的表达更加直观和简洁。
  8. API设计
    • 在设计API时,如果预期用户会频繁地传递简单的函数作为参数,那么使用函数式接口和Lambda表达式可以使API更加灵活和易用。

总之,Lambda表达式在Java中主要用于简化那些需要传递函数作为参数或返回值的场景,特别是在处理集合、线程、事件监听等时。通过使用Lambda表达式,可以写出更加简洁、易读和易维护的代码。

  • 18
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值