Java中Lambda表达式和函数式接口的使用和特性

 更新时间:2023年04月20日 11:08:31   作者:_BugMan  
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 表达式类型的方式。例如,下面的函数式接口 MyInterface 包含了一个抽象方法 doSomething

interface MyInterface {
    void doSomething();
}

要使用 Lambda 表达式实现这个接口,只需要提供一个与 doSomething 方法签名匹配的 Lambda 表达式即可。例如,下面的代码使用 Lambda 表达式创建了一个 MyInterface 对象,并调用了它的 doSomething 方法:

MyInterface myLambda = () -> System.out.println("Hello, world!");
myLambda.doSomething();

在这个例子中,我们使用 Lambda 表达式创建了一个 MyInterface 对象,并将它赋值给了 myLambda 变量。然后,我们调用了 myLambda.doSomething() 方法,输出了 Hello, world!

4.函数式接口

内置函数式接口

概述

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

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

Function

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

代码示例:

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

Predicate

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

public static void main(String[] args) {
        Predicate<String> predicate = (s) -> s.length() > 0;
        // 测试字符串的长度是否>0
        System.out.println(predicate.test("hello"));
        // 结果取反
        System.out.println(predicate.negate().test("hello"));
        System.out.println("=====or / and======");
        System.out.println(predicate.test(""));
        // 增加或判断,二者满足其一则为true
        System.out.println(predicate.or(s -> s.equals("")).test(""));
        // 增加与判断,二者都满足则为true
        System.out.println(predicate.and(s -> s.equals("hello")).test(""));
        System.out.println(predicate.and(s -> s.equals("hello")).test("hello"));
        System.out.println("=====isEqual======");
        // 判断是否相等
        System.out.println(Predicate.isEqual("hello").test(""));
        System.out.println(Predicate.isEqual("hello").test("hello"));
        Predicate<Boolean> nonNull = Objects::nonNull;
        Predicate<Boolean> isNull = Objects::isNull;
        Predicate<String> isEmpty = String::isEmpty;
        Predicate<String> isNotEmpty = isEmpty.negate();
    }

Consumer

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

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

Suppiler

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

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

5.级联与柯里化

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

以下列lambda表达式为例:

x->y->x+y

假设输入的为Integer类型,

用Function接口来表达即为:

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

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

输入一个Integer,返回一个Integer

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

到此这篇关于Java中Lambda表达式和函数式接口的使用和特性的文章就介绍到这了,更多相关Java lambda表达式与函数式接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java list.remove( )方法需要注意的两个坑

    浅谈Java list.remove( )方法需要注意的两个坑

    这篇文章主要介绍了浅谈Java list.remove( )方法需要注意的两个坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 如何在IDEA中查看依赖关系的方法步骤

    如何在IDEA中查看依赖关系的方法步骤

    这篇文章主要介绍了如何在IDEA中查看依赖关系的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • spring源码阅读--@Transactional实现原理讲解

    spring源码阅读--@Transactional实现原理讲解

    这篇文章主要介绍了spring源码阅读--@Transactional实现原理讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 时间中间键的整理

    时间中间键的整理

    这篇文章主要介绍了时间中间键的整理的相关资料,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • 浅谈System.getenv()和System.getProperty()的区别

    浅谈System.getenv()和System.getProperty()的区别

    这篇文章主要介绍了System.getenv()和System.getProperty()的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java 实现线程同步的方式有哪些

    java 实现线程同步的方式有哪些

    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题,本文将详细介绍,需要的朋友可以参考下
    2012-11-11
  • java线程安全锁ReentrantReadWriteLock原理分析readLock

    java线程安全锁ReentrantReadWriteLock原理分析readLock

    这篇文章主要为大家介绍了java线程安全锁ReentrantReadWriteLock原理分析readLock,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 史上最全的java随机数生成算法分享

    史上最全的java随机数生成算法分享

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法
    2014-01-01
  • 深入理解spring多数据源配置

    深入理解spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。本篇文章主要介绍了spring多数据源配置,有兴趣的可以了解一下。
    2017-01-01
  • MySql多表查询 事务及DCL

    MySql多表查询 事务及DCL

    这篇文章主要介绍了MySql多表查询 、事务、DCL的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09

最新评论