Lambda表达式是一种匿名函数,可以看成是对匿名类的一种简化写法,它能够以更简洁的语法实现相同的功能。
Lambda表达式的语法格式如下:
(parameters) -> expression
其中,参数可以有0个或多个,参数类型可以显式声明,也可以根据上下文自动推断;箭头“->”后面是一个表达式,或者是一个代码块,表达式的值会自动返回。
下面是一个简单的Lambda表达式示例:
(x, y) -> x + y
这个Lambda表达式有两个参数x和y,它们的类型是可以省略的,因为编译器可以根据上下文自动推断参数类型。箭头后面是一个表达式x + y
,它将两个参数相加并返回结果。另外,注意Lambda表达式没有方法名和返回值类型,因为它们都是隐含的。
函数式接口是一种只有一个抽象方法的接口,它通常用于Lambda表达式或者方法引用。Java8提供了java.util.function
包来定义一些常用的函数式接口,如Function
、Predicate
、Supplier
等。
下面是一个简单的函数式接口示例:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
这个接口定义了一个泛型方法convert
,它有一个参数类型F
和一个返回值类型T
。@FunctionalInterface
注解用于标记该接口是一个函数式接口,因为它只有一个抽象方法。
Lambda表达式常用于函数式接口的实现中。我们可以把Lambda表达式看成是一个匿名函数,它的类型是函数式接口。当我们声明一个函数式接口类型的变量时,我们可以使用Lambda表达式来初始化它。
下面是一个使用Lambda表达式和函数式接口的示例:
public class LambdaTest {
public static void main(String[] args) {
int a = 10;
int b = 5;
Converter<Integer, String> converter = (from) -> {
int result = from + a + b;
return String.valueOf(result);
};
String result = converter.convert(100);
System.out.println(result);
}
}
这个示例定义了一个名为Converter
的函数式接口,它的实现使用Lambda表达式来计算一个整数加上另外两个整数的结果并转换为字符串。在main
方法中,我们使用Lambda表达式来初始化一个Converter
类型的变量converter
,然后使用converter
来转换一个整数并打印结果。
另外一个示例是使用Lambda表达式对列表进行排序。我们可以使用List
接口的sort
方法和Comparator
接口配合使用来对列表进行排序。Comparator
接口是一个函数式接口,它可以通过Lambda表达式来实现。
下面是一个使用Lambda表达式对列表进行排序的示例:
public class LambdaTest {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用Lambda表达式对列表进行排序
Collections.sort(names, (String a, String b) -> a.compareTo(b));
System.out.println(names);
}
}
这个示例声明了一个List
类型的变量names
,它包含三个字符串元素。然后使用Collections
类的sort
方法和Lambda表达式来对列表进行排序。Lambda表达式a.compareTo(b)
实现了Comparator
接口的compare
方法,它用于比较两个字符串的大小。最后,我们打印排序后的列表。