专栏首页happyJared接口默认方法和 Lambda 表达式

接口默认方法和 Lambda 表达式

接口的默认方法

Java8 使开发者能够通过使用 default 关键字向接口添加非抽象方法实现,也称为虚拟扩展方法。

第一个例子:

interface Formula{

    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }

}

Formula 接口中,除了抽象方法计算接口公式,还定义了默认方法 sqrt(),实现该接口的类只需要实现抽象方法 calculate()

默认方法 sqrt() 允许直接使用,也可以直接通过接口创建对象,然后实现接口中的默认方法,下面通过代码来演示一下这种方式:

public class Main {

  public static void main(String[] args) {
    // TODO 通过匿名内部类方式访问接口
    Formula formula = new Formula() {
        @Override
        public double calculate(int a) {
            return sqrt(a * 100);
        }
    };
    System.out.println(formula.calculate(100));     // 100.0
    System.out.println(formula.sqrt(16));           // 4.0
  }

}

formula 是作为匿名对象实现的。

注: 不管是抽象类还是接口,都可以通过匿名内部类的方式访问,但不能通过抽象类或者接口直接创建对象。对于上面通过匿名内部类方式访问接口,我们可以这样理解:一个内部类实现了接口里的抽象方法,并且返回一个内部类对象,之后我们让接口的引用来指向这个对象

Lambda表达式

首先看看在老版本的 Java 中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

需要给静态方法 Collections.sort() 传入一个 List 对象,以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象,然后将其传递给 sort() 方法。

而在 Java8 中,就没必要使用这种传统的匿名对象方式了,Java8 提供了更简洁的语法,lambda 表达式:

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

可以看出,代码变得更段且更具有可读性,但是实际上还可以写得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

对于函数体只有一行代码的,可以去掉大括号 {} 以及 return 关键字,但其实还可以写得更短点:

names.sort((a, b) -> b.compareTo(a));

List 类本身就有一个 sort() 方法。并且 Java 编译器可以自动推导出参数类型,所以可以不用再写一次类型。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 1万步21天钉钉运动大神赛

      目前所在的企业,从入职开始到现在,内部沟通协作的主要软件也就是钉钉。三月初的时候,偶然在钉钉运动一栏中发现了这个活动,当时也没怎么犹豫,果断支付了2元契约金...

    happyJared
  • 函数式接口,方法和构造函数引用

    如何让现有的函数更友好地支持 Lambda,最好的方法是:增加函数式接口。所谓 “函数式接口”,是指仅仅只包含一个抽象方法,但是可以有多个非抽象方法(也就是之前...

    happyJared
  • Lamda 表达式作用域和内置函数式接口

    但是和匿名对象不同的是,这里的变量 num 可以不用声明为 final,该代码同样正确:

    happyJared
  • 什么?接口中方法可以不是抽象的「JDK8接口新语法的深度思考」

    在传统的接口语法中,接口中只可以有抽象方法。在是在实际的使用中,我们往往会需要用到很多和接口相关的功能(方法),这些功能会单独的拿出开放在工具类中。

    鹿老师的Java笔记
  • websocket+rabbitmq实战

      接到的需求是后台定向给指定web登录用户推送消息,且可能同一账号会登录多个客户端都要接收到消息

    老梁
  • 012.golang 接口interface

    qubianzhong
  • [ Java学习基础 ] Java的抽象类与接口

    Kevin_Zhang
  • RobotFrameWork编写接口测试及如何断言

    本篇是第一系列(Http接口自动化)的第五课程,如果对系列课程大纲不清楚的,可以查看《RobotFramework系列免费课程-开课了~》。

    测试开发技术
  • python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)

      上一篇和大家一起科普扫盲接口后,知道什么是接口,接口类型等,对其有了大致了解之后,我们就回到主题-接口测试。

    北京-宏哥
  • 浅谈接口自动化测试

    接口,即API,应用程序编程接口,关于接口的介绍,之前的博客就有详细介绍过,感兴趣的童鞋可以去看看:接口测试简介

    zhzhzhzhzhzhzhzhzhzhzhzhzhzh

扫码关注云+社区

领取腾讯云代金券