函数式接口(都2020了,该学学Java8了)
文章目录
- 一、函数式接口
一、函数式接口
- 定义:有且仅有一个抽象方法的接口
- 定义解释:
1、为什么要求有且仅有一个抽象方法?
只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导,因为Java中的Lambda可以被当做是匿名内部类的“语法糖”(见第2点),但是二者在原理上不同。
2、什么是语法糖?
“语法糖"是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的foreach语法,其实底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。
3、匿名内部类?
这里简单举个例子,如果你完全不懂什么是匿名内部类还要去查相关资料
例如,一个方法需要一个类的对象作为参数,但是你只有这个类的接口,不想因为某个方法单独写具体的实现类,这时你可以通过”匿名内部类“来实现这个接口来实现传参,而不必单独的去实现这个类。
匿名内部类示例:
//peolpe类
public interface People {public abstract String getName();
}
//car类
public class Car {//driveCar方法需要people类的实例public String driveCar(People people) {return people.getName() + " driving car !";}public static void main(String[] args) {Car car = new Car();String whoDrivingCar = car.driveCar(//people的匿名内部类new People() {@Overridepublic String getName() {return "lbw";}});System.out.println(whoDrivingCar);}
}
- 应用:一般作为方法的参数或者方法的返回值
- 函数式接口改造示例:
给接口加上@FunctionalInterface注解保证有且仅有一个抽象方法
@FunctionalInterface
public interface People {public abstract String getName();
}
将匿名内部类改写成lambada的简化写法
public class Car {public String driveCar(People people) {return people.getName() + " driving car !";}public static void main(String[] args) {Car car = new Car();String whoDrivingCar = car.driveCar(//匿名内部类//()里写参数//->lambada符号//{}里写实现() -> {return "lbw";});System.out.println(whoDrivingCar);}}
- 常用的函数式接口:
1、生产型Supplier:返回泛型中指定类型的数据
public class SupplierTest {//泛型为stringpublic static String getName(Supplier<String> supplier) {return supplier.get();}public static void main(String[] args) {//返回StringString name = getName(() -> {return "小明";});System.out.println(name);}
}
2、消费型:Consumer:消费泛型中指定类型数据
ublic class ConsumerTest {// 反转字符串public static void reverseString(String name, Consumer<String> consumer) {consumer.accept(name);}public static void main(String[] args) {reverseString("1234567", (String name) -> {System.out.println(new StringBuffer(name).reverse().toString());});}
}
3、转换型Function:将前者类型转换为后者类型
public class FunctionTest {public static Integer transfer(String string, Function<String, Integer> function) {return function.apply(string);}public static void main(String[] args) {System.out.println(transfer("100",(String string) -> {return Integer.parseInt(string);}));}
}
4、真假型Predicate:对传入数据进行判断,得到Boolean类型结果
public class PredicateTest {public static boolean isFlag(String string, Predicate<String> predicate) {return predicate.test(string);}public static void main(String[] args) {boolean flag = isFlag("奥利粤", (string) -> {return "奥利奥".equals(string);});System.out.println(flag==true?"真的奥利奥":"假的奥利奥");}
}
函数式接口(都2020了,该学学Java8了)相关推荐
- java8 Lambda表达式的应用(函数式接口、lambda表达式,方法引用及Stream API)
之前写了一篇博客简单介绍了一下java 8发布新增的一些特性功能,java 8在2014年发布,距今也不少年了,但是lambda表达式使用并不熟练,现在一边学习,一边记录一下. 目录 一.Lambda ...
- 玩转Java8的 Stream 之函数式接口
作者:litesky www.jianshu.com/p/2338cabc59e1 函数式接口是伴随着Stream的诞生而出现的,Java8Stream 作为函数式编程的一种具体实现,开发者无需关注怎 ...
- Java8函数式接口与Lambda表达式
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
- java 8 函数式接口_必看:通俗易懂地告诉你什么是java8中的“函数式接口”
花10分钟认真的看完一篇文章,或许会有意想不到的收获 java8发布已经好几年了,相信很多小伙伴都使用过java8,java8这版本带来了很多新特性,其中一个就是"函数式接口",今 ...
- Java新特性:Java8函数式接口与Lambda表达式(一)
摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...
- java8新特性_乐字节-Java8新特性-函数式接口
上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...
- Java8新特性之函数式接口,呦呦呦
什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的.从 Java8 开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个 ...
- java interface 函数_java8函数式接口(Functional Interface)
介绍 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式(箭头函数). 函数式接口代 ...
- 未公开接口主要指以下哪几类_Java8的 Stream 函数式接口,你了解多少?
点击蓝色"程序职场"关注我哟 加个"星标",天天和你一起进步 作者:litesky www.jianshu.com/p/2338cabc59e1 函数式接口是伴 ...
- comparator接口_8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
最新文章
- XIV Open Cup named after E.V. Pankratiev. GP of Europe
- 五大晶元厂的内存型号命名方式
- hdu 4607 Park Visit 求树的直径
- c 多文件全局变量_C语言开发单片机为啥都是全局变量形式?
- 图片怎么等比缩放_mac图像缩放工具Teorex iResizer
- Java 中的 String 真的是不可变的吗
- Qt5\MinGw编译器快速解决-QMYSQL driver not loaded问题
- c++ 11 中for循环新增的用法(基于范围的for循环)
- mongodb详细优化策略方案
- Ubuntu下安装ssh与配置
- 土建中级工程师考试用书电子版_真的!2020年湖南土建中级职称考试用书是没有指定的教材?...
- 全球与中国莨菪碱市场深度研究分析报告
- R语言中dim函数_R语言入门:函数介绍(3)—— %gt;%
- Gitter有趣的软件安装界面
- android拷机工具,如何科学理解麒麟9000的拷机功耗?
- 使用certbot生成https证书
- python读取oracle数据库性能_python 连接oracle数据库,报错解决,pandas读取。
- 今日分享 不可思议的人体
- Viewstate verification failed 解决办法
- matlab三相短路电流计算程序_基于MATLAB的短路电流计算程序编制.pdf
热门文章
- navicat 查看mysql版本,查看oracle版本,查看sqlserver版本
- linux 清除端口占用
- Linux下CS程序开发,Linux_Linux玩CS反恐精英的方法,一、下载必要的软件包
我们 - phpStudy...
- c语言最长公共子序列,算法设计与分析/动态规划——最长公共子序列LCS及模板...
- Noobs Round #2 (Div. 4) by Rudro25 C. Team(双指针+贪心)
- liunx下的组管理
- html5三国策略布阵,《三国志战略版》五谋臣阵容搭配推荐 程昱贾诩郭嘉五谋阵容解析...
- java饭店里面有五道菜, 黄花鱼 200块, 烤鸭 100块, 红烧肉 60块, 小炒肉 40块, 白水豆腐 10块。一个客人进了饭店, 根据身上的钱来决定最好能吃哪道菜 , 编程模拟。
- 风控之乱:零经验者,跳槽3次,年薪50万 2016-10-20 20:06 来源:一本财经(yibencaijing) 本文经授权转载!感谢原作者的辛勤创作! 金融的核心是什么? 严谨的金融从业者,
- 电影记忆之19(搏击俱乐部)