JDK8新特性:函数式接口
一,定义
函数式接口,英文为Functional Interface。首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法。
这里的只允许一个抽象方法不包括以下几种情况:
1,函数式接口里面允许有默认方法。我觉得可能是java设计师考虑到默认方法不是抽象的,它有默认实现的方法体。
2,函数式接口里面允许有静态方法。原因和上面相同,静态方法并不能是抽象方法。
3,函数式接口里面允许有java.lang.Object的public方法。可能是因为接口的实现类都继承了java.lang.Object。
package com.czx; //该注释是在编译期间检查是否为函数式接口
@FunctionalInterface
public interface JDK8Interface { //抽象方法
public boolean isNull(Object o); //java.lang.Object中public方法
public boolean equals(Object obj);
public int hashCode(); //static方法
public static void staticMethod(){
System.out.println("JDK8Interface的静态方法");
} //default方法
public default void defaultMethod(){
System.out.println("JDK8Interface的默认方法");
}
}
注意:如果你想定义一个函数式接口的话,最好把@FunctionalInterface加上,它会在编译期间检测该接口是否为函数式接口。
二,运用
我们可以通过Lambda表达式实现接口的抽象方法,比之前简直简洁太多。之前的方法是写一个实现该接口的类,并写出实现体。具体的不写了,我们看看通过Lambda表达式的代码有多简洁。
package com.czx; public class Test2 { public static void main(String[] args) {
JDK8Interface it = (a) -> a == null; System.out.println(it.isNull(2));//false
System.out.println(it.isNull("mine"));//false
System.out.println(it.isNull(null));//true
}
}
这就结束了,是不是很简单。
三,JDK8中新增的函数式接口
JDK8中引入了java.util.function,此包中内置许多函数式接口,现在将几个常用的函数式接口做说明。
1,Predicate接口
输入一个参数,并返回一个Boolean值,其中内置许多用于逻辑判断的默认方法:
@Test
public void predicateTest() {
Predicate<Integer> predicate = (s) -> s > 0;
boolean test = predicate.test(2);
System.out.println("该数字大于0:" + test); test = predicate.test(0);
System.out.println("该数字大于0:" + test); test = predicate.negate().test(0);
System.out.println("该数字小于等于0:" + test);
}
2,Function接口
接收一个参数,返回单一的结果,默认的方法(andThen)可将多个函数串在一起,形成复合Funtion(有输入,有输出)结果:
@Test
public void functionTest() { Function<Integer, Integer> add = (i) -> {
System.out.println("初始值:" + i);
return i+1;
};
Function<Integer, Integer> power = add.andThen((i) -> {
System.out.println("第一次运算:" + i);
return i * i;
}); Integer res = power.apply(2);
System.out.println("第二次运算:" + res);
}
3,Supplier接口
返回一个给定类型的结果,与Function不同的是,Supplier不需要接受参数(供应者,有输出无输入):
@Test
public void supplierTest() {
Supplier<String> supplier = () -> "有输出,无输入。";
String s = supplier.get();
System.out.println(s);
}
4,Consumer接口
代表了在单一的输入参数上需要进行的操作。和Function不同的是,Consumer没有返回值(消费者,有输入,无输出):
@Test
public void consumerTest() {
Consumer<Integer> add = (p) -> {
System.out.println("old value:" + p);
p = p + 1;
System.out.println("new value:" + p);
};
add.accept(1);
}
以上四个接口的用法代表了java.util.function包中四种类型,理解这四个函数式接口之后,其他的接口也就容易理解了。
JDK8新特性:函数式接口的更多相关文章
- jdk8新特性--函数式接口的使用
函数式接口的概念: 函数式接口的格式: 示例: 函数式接口的使用: 简化lambda表达式:
- Java8 新特性 函数式接口
什么是函数式接口 函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了. 函数式接口的 ...
- Java8 新特性----函数式接口,以及和Lambda表达式的关系
这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...
- java8新特性-函数式接口详细讲解及案例
一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...
- JDK8新特性之接口
在JDK7及以前的版本中,接口中都是抽象方法,不能定义方法体,但是从jdk8开始,接口中可以定义静态的非抽象的方法,直接使用接口名调用静态方法,但是它的实现类的类名或者实例却不可以调用接口中的静态方法 ...
- Java8的新特性--函数式接口
目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...
- JDK8新特性:接口的静态方法和默认方法
在jdk8之前,interface之中可以定义变量和方法,变量必须是public.static.final的,方法必须是public.abstract的.由于这些修饰符都是默认的,所以在JDK8之前, ...
- JDK8新特性之接口默认方法与静态方法
接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...
- JDK8新特性 -- Function接口: apply,andThen,compose
1 Function<T, R>中的T, R表示接口输入.输出的数据类型. R apply(T t) apply: .例子:func是定义好的Function接口类型的变量,他的输入.输出 ...
- JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
随机推荐
- 课上练习 script
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 彻底去除Google AdMob广告
应用中包含广告是能够理解的,但经常造成用户误点,或者广告切换时造成下载流量,就有点让人不舒服了. 以下就以Google AdMob广告为例,看怎样彻底去除他. 先分析一下Google AdMob的工作 ...
- python排序sorted与sort比较 (转)
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. sorted(iterable,key=None,revers ...
- Express+Nodejs 下的登录拦截实现
Express+Nodejs 下的登录拦截实现 利用商城举例,在商城中没有登录之前,可以看商品列表.详情.登录或者注册都可以,但是购买的时候是不行的,那么这个功能在Node后台中是怎么实现的呢,这个功 ...
- iconfont
查看一些网站代码的过程中,会发现许多的图片是不是背景图片或者<img>,而是类似于下面这样: .iconfont{ font-family:"iconfont" !im ...
- android全屏下的输入框未跟随软键盘弹起问题
最近开发中遇到,全屏模式下输入框在底部不会跟随软键盘弹起.于是网上搜索了解决的方案.大致找到了两种方案. 第一种 定义好此类 public class SoftKeyBoardListener { p ...
- Microsoft Visual Studio 常用快捷键总结
table tr:nth-child(odd){ background: #FFFFCC; } table tr:nth-child(even){ background: #FFFF99; } Mic ...
- 实验吧writeup
后台登录 1.看源码有这样一段php代码<!-- $password=$_POST['password']; $sql = "SELECT * FROM admin WHERE use ...
- 基于Homestead搭建PHP项目开发环境(适合Zend Framework,Laravel,Yii,thinkphp等)
参考: https://framework.zend.com/bl...参考: https://laravel.com/docs/5.5/... 第一步:软件的下载和安装 软件1:VirtualBox ...
- Python 实现把 .cvs 文件保存为 Excel 文件
# 导入可以把 CVS 转换为 Excel 的外部模块 import pandas as pd # 读出 csv 文件的内容 csv = pd.read_csv('Data.csv', encodin ...