专栏首页javathingsJava 8 中的拉姆达表达式是什么?

Java 8 中的拉姆达表达式是什么?

Java 8 中的拉姆达表达式是什么?

拉姆达表达式就是一个匿名函数。在 C#中,拉姆达表达式是一个委托类型,因此拉姆达表达式可以赋值给一个委托变量。 Java 中,没有委托,Java 的设计者只能想出一些曲折的方法来实现拉姆达表达式,这种方式就是用接口。

这种接口叫做函数式接口。但是这个接口比较特殊,必须是只有一个抽象方法(接口中的方法,无论是否加 abstract,都是抽象的,加不加都可以)。如果还需定义别的抽象方法,那只能定义 Object 类中的同名方法,事实上,例如 toString 和 Clone 这种方法的声明并不是抽象的,Java API 中某些接口重新声明 Object 类中的方法,目的是为了关联 javadoc 中的注释而已。

下面是一个合法的函数式接口:

@FunctionalInterface
public interface myFunctionalInterface {
    int dosomething(int c, int b);
    String toString(); // same to Object.toString
    int hashCode(); // same to Object.hashCode
    boolean equals(Object obj); // same to Object.equals
}

只有一个 dosomething 抽象方法,其它抽象方法是 Object 中的同名方法。

这样一个接口的 dosomething 方法就对应了拉姆达表达式,也就是说拉姆达表达式可以赋值给这个接口了。

注意的是@FunctionalInterface 注解不是必须的,但是建议加上,让编译器可以有所准备,代码可读性也更好。

下面的代码是合法的:

myFunctionalInterface m=(x,y)->{return x+y;};  

还能这样写,定义一个方法,参数包含一个拉姆达表达式。

public static int f(myFunctionalInterface m,int a,int b)
{
    return m.dosomething(a, b);
}

调用

int sum=f((x,y)->{return x+y;},1,2);
int sub=f((x,y)->{return x-y;},3,4);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 中 Comparable 和 Comparator 有何不同?

    Comparable 和 Comparator 都有比较的含义,那么他们之前有什么区别?

    水货程序员
  • Spring Boot 过滤器的实现

    过滤器是 Java Servlet 规范中定义的,它能够在请求传送给 Servlet 之前,对 ServletRequest 和 ServletResponse...

    水货程序员
  • Java 中什么是无锁编程?

    多线程环境下,为了保证数据不受到并发操作的影响,通常会采用加锁的策略保证一致性。除了加锁之外,还有一种方式就是采用无锁编程。

    水货程序员
  • 斐波那契数列递归算法和非递归算法

    week
  • 蓝桥杯--算法入门级题目及答案解析

    写在最前面: 本文中会出现大量的请查阅.请自学什么的,不是我不讲,本文是面向算法初学者和蓝桥杯的文章,如果真的想看进阶算法的也不会来看这些题目,所以不要介意,...

    风骨散人Chiam
  • 算法和数据结构: 十二 无向图相关算法基础

    从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记。

    yaphetsfang
  • 斐波那契数列的若干解法

    无道
  • 【2019秋PAT乙级真题】7-4 天长地久 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 06--图解数据结构之并查集

    张风捷特烈
  • DES算法-C/C++实现

    闲来无事,车一下轮子,折腾了大半天才搞懂 DESDES 是干毛子的,看了好多博客才弄清楚这个算法的具体原理,真是心累。 只是简单的实现,功能比较简陋,因为参考的...

    f_zyj

扫码关注云+社区

领取腾讯云代金券