前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >接口默认方法和 Lambda 表达式

接口默认方法和 Lambda 表达式

作者头像
happyJared
发布于 2019-07-29 02:55:41
发布于 2019-07-29 02:55:41
64000
代码可运行
举报
文章被收录于专栏:happyJaredhappyJared
运行总次数:0
代码可运行
接口的默认方法

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

第一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Formula{

    double calculate(int a);

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

}

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 中是如何排列字符串的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Collections.sort(names, (String a, String b) -> b.compareTo(a));

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names.sort((a, b) -> b.compareTo(a));

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java8Tutorial
接口的默认方法(Default Methods for Interfaces) Java 8使我们能够通过使用 default 关键字向接口添加非抽象方法实现。 此功能也称为虚拟扩展方法。
崔笑颜
2020/06/08
3980
Java8新增方法使用
Java8允许我们使用default关键字为接口添加非抽象的方法。这个特点也被称为扩展方法,下面是例子:
小森啦啦啦
2019/12/15
1.5K0
java8 新特性
Java 8 Tutorial 接口的默认方法(Default Methods for Interfaces) Lambda表达式(Lambda expressions) 函数式接口(Functional Interfaces) 方法和构造函数引用(Method and Constructor References) Lamda 表达式作用域(Lambda Scopes) 访问局部变量 访问字段和静态变量 访问默认接口方法 内置函数式接口(Built-in Functional Inter
袁新栋-jeff.yuan
2020/08/26
5250
干货 | Java8 新特性指导手册
小伙伴们,Java 版本都到 12 啦,我发现还有很多小伙伴对 8 的新特性不是很了解。
Java技术江湖
2019/09/24
1.4K0
干货 | Java8 新特性指导手册
JAVA8十大新特性详解
Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:
用户3467126
2019/11/01
9400
【小家java】使用lambda表达式传参是否有性能问题?
随着java8的普及,lambda表达式的书写日益增多。咱们看下面一个例子: 编程有一条原则如下:
YourBatman
2019/09/03
2.4K0
【小家java】使用lambda表达式传参是否有性能问题?
生产上常用 JDK 版本 1.7 与 1.8 新特性
JDK7开始,终于可以用二进制来表示整数(byte,short,int和long)。使用二进制字面量的好处是,可以是代码更容易被理解。语法非常简单,只要在二进制数值前面加 0b或者0B
BUG弄潮儿
2021/12/01
1.2K0
Java 8:一文掌握 Lambda 表达式
能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。
淡定的蜗牛
2019/11/08
5740
Java 8:一文掌握 Lambda 表达式
Java8之熟透Lambda表达式
​ Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
用户1195962
2019/09/29
5670
Java8之熟透Lambda表达式
Java 8简明教程
ImportNew注:有兴趣第一时间学习Java 8的Java开发者,欢迎围观《征集参与Java 8原创系列文章作者》。 以下是《Java 8简明教程》的正文。 “Java并没有没落,人们很快就会发现这一点” 欢迎阅读我编写的Java 8介绍。本教程将带领你一步一步地认识这门语言的新特性。通过简单明了的代码示例,你将会学习到如何使用默认接口方法,Lambda表达式,方法引用和重复注解。看完这篇教程后,你还将对最新推出的API有一定的了解,例如:流控制,函数式接口,map扩展和新的时间日期API等等。 允许在
美的让人心动
2018/06/14
1.1K0
Lambda表达式你会用吗?
我们先看看什么是函数。函数是一种最基本的任务,一个大型程序就是一个顶层函数调用若干底层函数,这些被调用的函数又可以调用其他函数,即大任务被一层层拆解并执行。所以函数就是面向过程的程序设计的基本单元。
说故事的五公子
2021/01/21
9090
Lambda表达式与Stream API
  Java8最具革命性的两个新特性是Lambda表达式和Stream API,它们都是基于函数式编程的思想,函数式编程给Java注入了新鲜的活力。
别团等shy哥发育
2023/02/25
2.3K0
Lambda表达式与Stream API
Java8 Lambda表达式.md什么是λ表达式λ表达式的类型λ表达式的使用其它相关概念
为了支持函数式编程,Java 8引入了Lambda表达式. 在Java 8中采用的是内部类来实现Lambda表达式.具体实现代码,可以通过debug看, 同时通过字节码查看工具及反编译工具来验证.
一个会写诗的程序员
2018/08/20
1.7K0
9-Lambda表达式
Lambda表达式是JDK1.8开始之后的新技术,是一种代码的新语法,是一种特殊写法
Ywrby
2022/10/27
2120
Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里
你要知道的Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本文主要讲解Java8 Stream API,但是要讲解这一部分需要匿名内部类、lambda表达式以及函数式接口的相关知识,本文将分为两篇文章来讲解上述内容,读者可以按需查阅。 Java 匿名内部类、lambda表达式与函数式接口 Java Stream API 本文是该系列博文的第一篇Java 匿名
WWWWDotPNG
2018/04/10
1.1K0
Java8学习(3)- Lambda 表达式
猪脚:以下内容参考《Java 8 in Action》 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 代码: https://github.com/Ryan-Miao/someTest/blob/master/src/main/java/com/test/java8/c3/AppleSort.java 上一篇: Java8学习(2)- 通过行为参数化传递代码--lambda代替策略模式 ---- 1. 结构 初始化一个比较器: Comparato
Ryan-Miao
2018/03/13
1K0
Java8学习(3)- Lambda 表达式
(91) Lambda表达式 / 计算机程序的思维逻辑
在之前的章节中,我们的讨论基本都是基于Java 7的,从本节开始,我们探讨Java 8的一些特性,主要内容包括: 传递行为代码 - Lambda表达式 函数式数据处理 - 流 组合式异步编程 - CompletableFuture 新的日期和时间API 本节,我们先讨论Lambda表达式,它是什么?有什么用呢? Lambda表达式是Java 8新引入的一种语法,是一种紧凑的传递代码的方式,它的名字来源于学术界的λ演算,具体我们就不探讨了。 理解Lambda表达式,我们先回顾一下接口、匿名内部类和
swiftma
2018/01/31
6510
(91) Lambda表达式 / 计算机程序的思维逻辑
Java8新特性及使用(一)
以下是Java8中的引入的部分新特性。关于Java8新特性更详细的介绍可参考这里。
Abalone
2022/07/14
1K0
如何使用Lambda表达式替代匿名内部类?
Java Lambda 表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法。实际上 Lambda 表达式并不仅仅是匿名内部类的语法糖,JVM 内部是通过 invokedynamic 指令来实现 Lambda 表达式的。具体原理放到下一篇。本篇我们首先感受一下使用 Lambda 表达式带来的便利之处。
码农架构
2021/02/12
2.1K0
总结:JDK1.5-JDK1.8各个新特性
作者:iwen-J | 链接:https://my.oschina.net/zhuqingbo0501/blog/1784693 JDK各个版本的新特性 以下介绍一下JDK1.5版本到JDK1.7版本的特性及JDK1.8主要部分特性。仅供参考。 JDK1.5新特性 1:自动装箱与拆箱: 自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。 自动拆箱:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方
java思维导图
2018/04/08
2K0
总结:JDK1.5-JDK1.8各个新特性
相关推荐
Java8Tutorial
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文