JAVALambda表达式与函数式接口详解

Lambda表达式是Java 8中新增的一种语法,它使得Java语言变得更加简洁、高效。Lambda表达式就是将一个匿名内部类的实现变成了一种函数式风格,被称为“函数式编程”,同时Java 8中也新增了许多函数式接口来支持Lambda表达式,为Java程序员提供了更

JAVALambda表达式与函数式接口详解

Lambda表达式是Java 8中新增的一种语法,它使得Java语言变得更加简洁、高效。Lambda表达式就是将一个匿名内部类的实现变成了一种函数式风格,被称为“函数式编程”,同时Java 8中也新增了许多函数式接口来支持Lambda表达式,为Java程序员提供了更多的选择。

什么是Lambda表达式

Lambda表达式可以认为是一个匿名函数,它没有名称,但它可以接收参数,执行代码,并返回结果。一个Lambda表达式可以看作是一个函数式接口的实例,函数式接口是只有一个抽象方法的接口。Lambda表达式与匿名内部类不同之处在于,Lambda表达式没有单独的类定义,而是直接写在代码中。

Lambda表达式的语法如下:

(parameter1, parameter2, …) -> { // lambda body }

其中,参数列表可以为空,也可以包含多个参数,多个参数之间用逗号分隔;箭头符号 " -> " 将参数列表和Lambda表达式的主体分开,箭头符号之前的是参数列表,箭头符号之后的是Lambda表达式的主体。

例如:

// 定义一个接口 MyInterface
interface MyInterface {
    void doSomething();
}

// 使用 Lambda 表达式实现
MyInterface myInterface = () -> System.out.println("Hello World!");
myInterface.doSomething();

将输出:Hello World!

函数式接口

函数式接口是只有一个抽象方法的接口,Java 8中新增了许多函数式接口,这些函数式接口是对Lambda表达式的支持。函数式接口从功能上来看可以与以前的单抽象方法接口等价,但比单抽象方法接口更容易使用和理解。Java中有11个预定义的函数式接口,这些接口都在包 java.util.function 中,下面介绍其中几个重要的函数式接口。

Consumer

Consumer是函数式接口,它接收一个输入参数,但没有返回任何输出结果,使用的语法为:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}   

其中,T 是输入参数的类型,accept 方法接收一个输入参数,并处理它。

例如:

// 使用 Lambda 形式的 Consumer 接口
Consumer<String> consumer = x -> System.out.println(x.toUpperCase());
consumer.accept("hello world"); // 输出:HELLO WORLD

Function

Function 是函数式接口,它接收一个输入参数,并返回一个输出结果,使用的语法为:

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}   

其中,T 是输入参数的类型,R 是输出结果的类型,apply 方法接收一个输入参数,并返回处理后的结果。

例如:

// 使用 Lambda 形式的 Function 接口
Function<Integer, String> function = x -> String.valueOf(x * 2);
String result = function.apply(5);
System.out.println(result); // 输出:10

Predicate

Predicate 是函数式接口,它接收一个输入参数,并返回一个布尔值结果,使用的语法为:

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}   

其中,T 是输入参数的类型,test 方法接收一个输入参数,并返回一个布尔值结果。

例如:

// 使用 Lambda 形式的 Predicate 接口
Predicate<String> predicate = x -> x.length() > 5;
boolean result = predicate.test("Hello World");
System.out.println(result); // 输出:true

示例说明

示例一

假设有一个自定义的函数式接口 DefineFunction,它有两个输入参数类型 Double,并且有一个返回类型为 Double 的方法 calculate。现在使用 Lambda 表达式计算两个数的乘积,该如何实现呢?

定义函数式接口:

@FunctionalInterface
public interface DefineFunction {
    Double calculate(Double x, Double y);
}

使用 Lambda 表达式计算两个数的乘积:

DefineFunction defineFunction = (x, y) -> x * y;
Double result = defineFunction.calculate(2.0, 3.0);
System.out.println(result); // 输出:6.0

示例二

假设有一个字符串列表 list,现在需要将列表中的每个元素都转为大写,并输出。使用 Lambda 表达式的 Consumer 接口,可以非常简单地完成该任务。

处理代码如下:

List<String> list = Arrays.asList("hello", "world", "!");
list.forEach(x -> System.out.println(x.toUpperCase()));

输出结果为:

HELLO
WORLD
!

上述示例中,list 是一个字符串类型的列表,使用 Arrays.asList() 方法将字符串转为集合;forEach 方法是Java 8中新增的方法,它接收一个 Consumer 接口的实现作为参数,对集合中的每个元素进行处理,使用 Lambda 表达式的语法可以非常简单地对列表中的每个元素进行处理,实现了将列表中的每个元素都转成大写。

本文标题为:JAVALambda表达式与函数式接口详解

基础教程推荐