JAVA 8 接口中的默认方法和Lambda 表达式基本使用
一、接口中的默认方法
在JDK1.8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的
在JDK 1.8开始 支持使用static和default 修饰 可以写方法体,不需要子类重写。
1.1、定义接口默认方法
public interface MyInterface {// 普通抽象方法,默认是public abstract修饰的,没有方法体void add();/** 默认方法,有方法体 JDK1.8之后* 任何一个实现了MyInterface 接口的类都会向动继承defaultAdd的实现*/default void defaultAdd() {System.out.println("JDK8--》defaultAdd");}/** 静态方法,有方法体 JDK1.8之后* 可以使用MyInterface类直接调用*/static void getAdd() {System.out.println("JDK8--> static getAdd");}
}
定义接口默认实体方法如果报extension methods are not supoorted at language level 'x'
解决方式请查看: https://blog.csdn.net/qazzwx/article/details/119378120
1.2、接口实现
public class MyInterfaceImpl implements MyInterface {@Overridepublic void add() {}public static void main(String[] args) {MyInterface myInterface=new MyInterfaceImpl();myInterface.defaultAdd();MyInterface.getAdd();}
}
打印值
二、Lambda表达式
2.1、Lambda表达式百度百科
https://baike.baidu.com/item/Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/4585794?fr=aladdin
2.2、Lambda表达式依赖于函数接口
- @FunctionalInterface 表示该接口为函数接口
- 在函数接口中只能够允许有一个抽象方法
- 在函数接口中必须有一个抽象方法
- 可以在函数接口中定义object类中public方法
- 可以通过default 修饰为普通方法
没有抽象方法会报错 no target method
多个抽象方法会报错
Multiple non-overriding abstract methods found in interface com.enter.service.MyInterface
使用Object中非 public方法会报错
Multiple non-overriding abstract methods found in interface com.enter.service.MyInterface
函数式接口
@FunctionalInterface
public interface MyInterface {// 普通抽象方法,默认是public abstract修饰的,没有方法体void add();boolean equals(Object obj);/** 默认方法,有方法体 JDK1.8之后* 任何一个实现了MyInterface 接口的类都会向动继承defaultAdd的实现*/default void defaultAdd() {System.out.println("JDK8-->defaultAdd");}/** 静态方法,有方法体 JDK1.8之后* 可以使用MyInterface类直接调用*/static void getAdd() {System.out.println("JDK8--> static getAdd");}
}
Lamdba调用匿名函数接口对比其他方式
public class Test {public static void main(String[] args) {// 使用new的实现类的形式调用接口MyInterface myInterface = new MyInterfaceImpl();myInterface.add();// 使用匿名内部类调用有参数函数方法MyInterface myInterface1 = new MyInterface() {@Overridepublic void add() {System.out.println("使用匿名内部类的形式调用接口");}};myInterface1.add();// 使用Lamdba 调用有参数函数方法MyInterface myInterface2 = () -> {System.out.println("使用Lambda表达式形式调用接口");};myInterface2.add();// 使用Lamdba 调用有参数函数方法 精简版MyInterface myInterface3 = () -> System.out.println("使用Lambda表达式形式调用接口");myInterface3.add();}
}
带参数和返回值
@FunctionalInterface
public interface MyInterface {int add(int i,int j);}
public class Test {public static void main(String[] args) {int num1 = 6;int num2 = 6;// 使用匿名内部类调用有参数函数方法int result = new MyInterface() {@Overridepublic int add(int i, int j) {return i + j;}}.add(num1, num2);System.out.println(result);// 使用Lamdba 调用有参数函数方法MyInterface myInterface2 = (i, j) -> {System.out.println("使用Lambda表达式形式调用接口");return i + j;};System.out.println(myInterface2.add(num1, num2));}
}
Java1.8中关于函数式接口的包是java.util.function,里面全部是函数式接口。主要包含几大类:Function、Predicate、Supplier、Consumer和*Operator(没有Operator接口,只有类似BinaryOperator这样的接口)。
JAVA 8 接口中的默认方法和Lambda 表达式基本使用相关推荐
- C#中的委托,匿名方法和Lambda表达式
简介在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Firs ...
- [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...
- java 8 lambda reduce_java8种的reduce方法和lambda表达式结合使用
今天碰到了java8种的reduce方法,查了资料之后写一些总结,以免自己以后用到. 计算1,2,3,4,5 的和,并且初始值为3 也就是计算3+1+2+3+4+5 1.使用Stream 两个参数的r ...
- IntelliJ Idea中使用Java8新特性lambda表达式
环境: 环境变量JAVA_HOME配置jdk1.8 idea配置支持lambda: File -> Project Structure -> Modules -> Language ...
- java接口可以写方法体吗_JDK1.8接口中可以写方法体
在Java中,接口里只能写方法的声明,而不能写方法的具体实现,方法的实现要在实现接口的类中编写.但在JDK1.8中,接口可以对方法的声明写具体实现,个人觉得这有点违背接口的设计初衷. 下面我们来具体看 ...
- Java 8——接口中个的默认方法和静态方法
在Java SE 8之前,interface只是事物的抽象,用来定义统一的抽象事物和描述事物的抽象行为和属性. 但是在Java SE 8中,增加了可以在interface中增加默认实现的行为和事物的静 ...
- Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法
Java 8 辣么大(lambda)表达式不慌之-–(四)示例-Collectors中的joining 方法和mapping方法 joining 方法 mapping方法 先定义好后面做示例要用的数据 ...
- Java接口中的默认方法冲突
在Java中,我们可以为其接口中定义的方法提供一个默认的实现.当然,这可能并没有很大的用处,不过,在某些情况下可能很有用!如果要为接口方法提供一个默认实现,必须要用 default关键字 修饰. 在为 ...
- Java创建数组的三种方法和ArrayList的用法
Java创建数组的三种方法和ArrayList的用法 Java创建数组的三种方法 一.声明并赋值 二.声明数组名开辟空间 三.声明数组并指定元素个数 四.多维数组 ArrayList的用法 一.添加元 ...
最新文章
- R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码、tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例
- linux oracle 配置监听器
- redis 面试问题问答Top 10
- Struts值栈与Ognl
- ssl1746-商务旅行【tarjan,LCA】
- 定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)...
- 轮盘赌算法的java实现算例
- java炫酷龙卷风源码_Java-使用二叉树实现快速排序-遁地龙卷风
- 浅析ASP.NET HTTP Module
- linux 6.7 ifcfg eth0,centos 的ifcfg-eth0只有只读权限,怎么修改其内容呢?
- 安防与消防融合发展的现状与机遇分析
- 21年,周杰伦越发孤独
- 快速查询快递单号物流的方法有哪些?
- 设计模式-Facade门面-Mediator调停者
- 双击打开Excel文件要反应很久之后才能打开,先开excel程序,再打开文件就很快的解决办法...
- 【数据库系统】数据库编程
- handlebars使用
- DXP_protel2004_原理图设计基础_集成运放原理图设计_原理图后期处理
- 阿里云实时音视频直播鉴权java代码示例
- 【多图超详细】从零开始安装配置Cuckoo sandbox并提交样本进行分析
热门文章
- Danalab线束测试仪
- 超级计算机天河二号浅析
- 让Github飞起来
- 通天阁塔机器人图片_世界最大双足机器人亮相世博大阪馆
- 学生成绩管理系统mysql课程设计_数据库课程设计(极其简单的学生成绩管理系统)...
- Springboot系列(二十二):如何纯文本转成.csv格式文件?|超级详细,建议收藏
- 武汉大学计算机学院出国,2017年6月武汉大学研究生出国交流资助项目评审结果公示...
- 【笔记】浮动属性float的应用02——浮动图像和标题
- vb6将excel数据导入mysql_VB6.0如何实现将excel数据导入mssql数据库中
- unbound:安装与配置