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 ...
随机推荐
- JavaScript+CSS交互
当鼠标移动到小图片上时,小图片显示红色边框并在上面大图片显示相应大图片,效果如图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...
- POJ_2411_Mondriaan's Dream_状态压缩dp
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15407 Accepted: 888 ...
- CorelDRAW记事本写实图标的制作流程
本篇教程用CorelDRAW快速制作记事本写实图标,在制作的过程中主要使用了位图填充和金属材质的实现,加之一些常用工具的用法处理,最后将对象剪裁至图文框就好了,现在跟小编一起来看看详细的操作吧! 使用 ...
- BZOJ 1146: [CTSC2008]网络管理Network 带修改主席树_树套树_DFS序
Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路 ...
- 给数组增加remove函数
//给数组增加indexOf函数Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { ...
- codeforces 466B Wonder Room(思维,暴力)
题目 参考了别人的博客,百度来的博客 #include<iostream> #include<string> #include<stdio.h> #include& ...
- [poj1325] Machine Schedule (二分图最小点覆盖)
传送门 Description As we all know, machine scheduling is a very classical problem in computer science a ...
- laravel-hprose(rpc框架)
Laravel-hprose 基于 hprose/hprose-php 开发的Laravel扩展:laravel-hprose 版本要求 Laravel>=5.2 安装 composer req ...
- 实用的 鼠标滑上显示提示信息的jq插件
使用非常简单, 引用 css js文件, 将需要显示提示信息的元素 添加class="tooltip"类名, 在title属性填写提示信息就好了title="啊啊啊啊&q ...
- 【习题 4-5 Uva1590】 IP Networks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设从第i位开始有不一样的. 那么就把i+1..32位全都置0. 掩码的话类似.前i为全为1,后面32-i位全0. 尽量让后面的连续 ...