Java中Lambda表达式和函数式接口怎么使用

其他教程   发布日期:2025年03月23日   浏览次数:112

今天小编给大家分享一下Java中Lambda表达式和函数式接口怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    1.概述

    当Java 8发布时,其中最令人兴奋的特性之一就是 Lambda 表达式。Lambda 表达式是一种轻量级、简洁和高效的函数式编程方法。它可以用来代替 Java 旧有的匿名内部类,提高代码的可读性和可维护性。

    2.lambda表达式的基础

    Lambda 表达式是一个匿名函数,由输入参数和处理逻辑两部分组成:

    (parameter1, parameter2, ...) -> { code block }

    输入或者输出可以为空:

    () -> System.out.println("Hello, world!")
    (a) -> {}
    () -> {}

    多参数用括号,单参数可以不用括号:

    (a,b) -> a+b
    a -> System.out.print(a)

    多条处理逻辑用花括号,单条处理逻辑可以不用花括号:

    (a,b) -> a+b;
    (a,b) -> {a+b;a-b;}

    3.JAVA中的lambda表达式

    要在 Java 中使用 Lambda 表达式,需要将它们赋值给一个函数式接口变量。函数式接口是只包含一个抽象方法的接口,它们提供了一种定义 Lambda 表达式类型的方式。例如,下面的函数式接口

    1. MyInterface
    包含了一个抽象方法
    1. doSomething
    1. interface MyInterface {
    2. void doSomething();
    3. }

    要使用 Lambda 表达式实现这个接口,只需要提供一个与

    1. doSomething
    方法签名匹配的 Lambda 表达式即可。例如,下面的代码使用 Lambda 表达式创建了一个
    1. MyInterface
    对象,并调用了它的
    1. doSomething
    方法:
    1. MyInterface myLambda = () -> System.out.println("Hello, world!");
    2. myLambda.doSomething();

    在这个例子中,我们使用 Lambda 表达式创建了一个

    1. MyInterface
    对象,并将它赋值给了
    1. myLambda
    变量。然后,我们调用了
    1. myLambda.doSomething()
    方法,输出了
    1. Hello, world!

    4.函数式接口

    内置函数式接口

    概述

    JDK8内置实现了一些常用的函数式接口:

    接口 作用
    Function 程序中映射逻辑的抽象
    Predicate 程序中判断逻辑的抽象
    Consumer 程序中的消费型逻辑的抽象
    Suppiler 程序中的生产逻辑的抽象

    Function

    Function接口,可以定义入参和出参的类型,可用于类型转换。

    代码示例:

    1. Function<String,Integer> function=(String i)-> Integer.parseInt(i);
    2. System.out.println(function.apply("1")==1);

    Predicate

    Predicate接口,指定返回值为布尔类型,可用于断言。

    1. public static void main(String[] args) {
    2. Predicate<String> predicate = (s) -> s.length() > 0;
    3. // 测试字符串的长度是否>0
    4. System.out.println(predicate.test("hello"));
    5. // 结果取反
    6. System.out.println(predicate.negate().test("hello"));
    7. System.out.println("=====or / and======");
    8. System.out.println(predicate.test(""));
    9. // 增加或判断,二者满足其一则为true
    10. System.out.println(predicate.or(s -> s.equals("")).test(""));
    11. // 增加与判断,二者都满足则为true
    12. System.out.println(predicate.and(s -> s.equals("hello")).test(""));
    13. System.out.println(predicate.and(s -> s.equals("hello")).test("hello"));
    14. System.out.println("=====isEqual======");
    15. // 判断是否相等
    16. System.out.println(Predicate.isEqual("hello").test(""));
    17. System.out.println(Predicate.isEqual("hello").test("hello"));
    18. Predicate<Boolean> nonNull = Objects::nonNull;
    19. Predicate<Boolean> isNull = Objects::isNull;
    20. Predicate<String> isEmpty = String::isEmpty;
    21. Predicate<String> isNotEmpty = isEmpty.negate();
    22. }

    Consumer

    Consumer接口,又叫消费接口,没有返回值,就像把输入消费掉了一样。

    1. public static void main(String[] args) {
    2. Consumer<Object> consumer1 = new Consumer<Object>() {
    3. @Override
    4. public void accept(Object o) {
    5. System.out.println("这次消费了:" + o.toString());
    6. }
    7. };
    8. consumer1.accept("100w元在双十一!这下穷死了!");
    9. Consumer<String> consumer2 = s -> System.out.println("这次消费了:" + s);
    10. consumer2.accept("120w元在双十二!又穷死了!");
    11. }

    Suppiler

    Suppiler接口,又叫生产接口,可以自定义返回值,用来生产一些东西。

    1. public static void main(String[] args) {
    2. // 生成一个字符串
    3. Supplier<String> supplier1 = () -> "abcde";
    4. // 生成一个随机数
    5. Supplier<Integer> supplier2 = () -> new Random().nextInt(10);
    6. // 产生一个运行时异常
    7. Supplier<RuntimeException> supplier3 = () -> new RuntimeException();
    8. System.out.println(supplier1.get());
    9. System.out.println(supplier2.get().intValue());
    10. System.out.println(supplier3.get());
    11. }

    5.级联与柯里化

    级联表达式,含有多个箭头的lambda表达式,即“套娃”lambda表达式。

    以下列lambda表达式为例:

    x->y->x+y

    假设输入的为Integer类型,

    用Function接口来表达即为:

    输入一个Integer x,返回一个Integer y,

    Integer y又可以用Function接口来表示为:

    输入一个Integer,返回一个Integer

    1. Function<Integer,Function<Integer,Integer>> functionFunction= x->y->x+y;
    2. System.out.println(functionFunction.apply(2).apply(3));

    以上就是Java中Lambda表达式和函数式接口怎么使用的详细内容,更多关于Java中Lambda表达式和函数式接口怎么使用的资料请关注九品源码其它相关文章!