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 ...
随机推荐
- jsp连接MySQL实现登录
1.下载驱动,并把jar包放到Tomcat的lib目录下 下载连接 2.把jar包添加到项目中 3.登录页面 <%@ page language="java" content ...
- ASP.NET MVC5 网站开发实践(一)
一.开发环境 1.开发环境: Visual Studio 2013 2.数据库:Sql Server 2012 3.代码管理:TFS(微软免费提供的) 说明:VS2013与vs2012感觉变化不大,我 ...
- Python基础知识-Day4
一.函数关键字关键字是Python内置的,具有特殊意义的标识符,自定义标识符命名时不可与之重复.可以通过以下代码查看Python内置的关键字内容. import keyword print(keywo ...
- 47.serch基本语法
主要知识点 1._search api基本语法 2.http协议中get请求带上request body 一.search api的基本语法 1.GET /_search {所传递的参 ...
- Problem 19
Problem 19 You are given the following information, but you may prefer to do some research for yours ...
- Redis启动出错 noauth authentication required.
输入认证过的密码即可. 在命令行中运行: auth password
- 学习EXTJS6(3)基本概念
ExtJS不再纠缠HTML和CSS上.概念和传统的程序相近.如面板panel,布局Layout.组件Component等等. 1.渲染Render:ExtJS页面在浏览器中装载完成后完全展现出来的一个 ...
- git 添加到环境变量
github 新增仓库的后的提示 …or create a new repository on the command line echo "# top" >> REA ...
- 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图
第七篇 CAP https://zhuanlan.zhihu.com/p/20399316?refer=auxten CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s t ...
- 【转载】linux中shell命令test用法和举例
test 命令最短的定义可能是评估一个表达式:如果条件为真,则返回一个 0 值.如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值.检查最后所执行命令的状态的最简便方法是使用 $? 值 ...