Lambda表达式的介绍和用法

85 阅读4分钟

1、Lambda表达式简介

在Java编程语言中,Lambda表达式是一种匿名函数,它允许你像传递数据一样传递代码。Lambda表达式可以作为参数传递给方法或存储在变量中,并且可以像任何其他对象一样传递和操作。

Lambda表达式的语法如下:

(parameter1, parameter2, ...) -> { statement1; statement2; ... }

其中,参数列表位于括号内,箭头“->”分隔参数列表和Lambda表达式的主体,Lambda表达式的主体位于花括号内。以下是Lambda表达式的示例:

// 使用Lambda表达式作为参数传递给方法
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");

list.forEach((String s) -> System.out.println(s));

// 使用Lambda表达式存储在变量中
MyInterface myInterface = (n1, n2) -> {
    int sum = n1 + n2;
    return sum;
};

int result = myInterface.calculate(10, 5);

System.out.println(result);

在这个例子中,我们首先使用Lambda表达式作为参数传递给forEach方法,以便在列表中的每个元素上运行代码。然后,我们定义了一个可以计算两个数字之和的接口,并将Lambda表达式存储在变量myInterface中。最后,我们使用Lambda表达式计算10和5的和,并将结果打印到控制台上。

2、Lambda表达式用法

Lambda表达式的用法也是多种多样的,下面列举常见的几种用法:

  1. 作为函数式接口的实现

Lambda表达式可以用作函数式接口的实现。函数式接口是只包含一个抽象方法的接口。例如,java.lang.Runnable 和 java.util.concurrent.Callable 接口都是函数式接口。下面是一个使用Lambda表达式实现Runnable接口的示例:

Runnable r = () -> System.out.println("Hello World!");
Thread t = new Thread(r);
t.start();
  1. 作为参数传递到方法中

Lambda表达式可以作为参数传递到方法中。这使得我们可以将代码块传递给方法,从而允许方法在运行时根据需要执行该代码块。以下是一个将Lambda表达式作为参数传递到方法中的示例:

List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach((String s) -> System.out.println(s));
  1. 通过Stream API进行数据处理

Lambda表达式可以与Java 8中引入的Stream API一起使用,对集合或数组进行过滤,映射,排序和归约等操作。以下是一个使用Lambda表达式进行Stream操作的示例:

List<Integer> numbers = Arrays.asList(3, 2, 4, 7, 10, 6);
int sum = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(Integer::intValue)
.sum();
System.out.println(sum);
  1. 作为返回值

Lambda表达式可以作为方法的返回值,允许我们根据需要生成代码块。以下是一个将Lambda表达式作为返回值的示例:

public static Runnable getRunnable() {
    return () -> System.out.println("Hello World!");
}
  1. 作为变量

Lambda表达式可以被存储在变量中,以便稍后使用。以下是一个将Lambda表达式存储在变量中的示例:

IntBinaryOperator add = (a, b) -> a + b;
int result = add.applyAsInt(10, 5);
System.out.println(result);

3、常用的20个Lambda表达式

  1. 消费者(Consumer):消费一个参数并且不返回结果。
Consumer<String> consumer = (String s) -> System.out.println(s);
  1. 生产者(Supplier):不接受任何参数但是会返回一个结果。
Supplier<Integer> supplier = () -> new Random().nextInt();
  1. 函数(Function):接受一个参数并返回一个结果。
Function<String, Integer> function = (String s) -> s.length();
  1. 断言(Predicate):接受一个参数并返回一个布尔值。
Predicate<Integer> predicate = (Integer i) -> i > 10;
  1. 去重(distinct):
List<Integer> list = Arrays.asList(1, 1, 2, 3, 3);
list.stream().distinct().forEach(System.out::println);
  1. 过滤(filter):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().filter(i -> i > 3).forEach(System.out::println);
  1. 转换(map):
List<String> list = Arrays.asList("1", "2", "3");
list.stream().map(Integer::parseInt).forEach(System.out::println);
  1. 排序(sorted):
List<Integer> list = Arrays.asList(3, 2, 1);
list.stream().sorted().forEach(System.out::println);
  1. 限制(limit):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().limit(3).forEach(System.out::println);
  1. 跳过(skip):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().skip(3).forEach(System.out::println);
  1. 最大值(max):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer max = list.stream().max(Integer::compareTo).orElse(null);
  1. 最小值(min):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer min = list.stream().min(Integer::compareTo).orElse(null);
  1. 求和(sum):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = list.stream().mapToInt(Integer::intValue).sum();
  1. 平均值(average):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
double average = list.stream().mapToInt(Integer::intValue).average().orElse(0.0);
  1. 拼接(joining):
List<String> list = Arrays.asList("Hello", "world");
String result = list.stream().collect(Collectors.joining(", "));
  1. 计数(count):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().count();
  1. 匹配(allMatch):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(i -> i > 0);
  1. 匹配(anyMatch):
List<Integer> list = Arrays.asList(-1, -2, 3, -4, -5);
boolean anyMatch = list.stream().anyMatch(i -> i > 0);
  1. 匹配(noneMatch):
List<Integer> list = Arrays.asList(-1, -2, -3, -4, -5);
boolean noneMatch = list.stream().noneMatch(i -> i > 0);
  1. 查找第一个元素(findFirst):
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer first = list.stream().findFirst().orElse(null

关注公众号,加入技术群,一起探讨前沿技术:

qrcode_for_gh_efa781664d3c_258.jpg