本篇文章为你整理了Java 8 函数式接口()的详细内容,包含有 Java 8 函数式接口,希望能帮助你了解 Java 8 函数式接口。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
GreetingService greetService1 = message - System.out.println("Hello " + message);
函数式接口可以对现有的函数友好地支持 lambda。
JDK 1.8 之前已有的函数式接口:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JDK 1.8 新增加的函数接口:
java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
BinaryOperator T
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
函数式接口实例
Predicate T 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。
该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。
该接口用于测试对象是 true 或 false。
我们可以通过以下实例(Java8Tester.java)来了解函数式接口 Predicate T 的使用:
Java8Tester.java 文件
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Java8Tester {
public static void main(String args[]){
List Integer list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// Predicate Integer predicate = n - true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true
System.out.println( 输出所有数据: );
// 传递参数 n
eval(list, n- true);
// Predicate Integer predicate1 = n - n%2 == 0
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n%2 为 0 test 方法返回 true
System.out.println( 输出所有偶数: );
eval(list, n- n%2 == 0 );
// Predicate Integer predicate2 = n - n 3
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n 大于 3 test 方法返回 true
System.out.println( 输出大于 3 的所有数字: );
eval(list, n- n 3 );
public static void eval(List Integer list, Predicate Integer predicate) {
for(Integer n: list) {
if(predicate.test(n)) {
System.out.println(n + );
#0erichuang
eri***su@qq.com
39eval 函数可以写为如下格式:
private static void eval(List Integer list, Predicate Integer predicate) {
list.stream().filter(predicate).forEach(System.out::println);
}
或者直接可以不用定义 eval 函数,使用:
list.stream().filter(n - n 3).forEach(System.out::println);
来输出所有大于 3 的数字。
erichuangerichuang
eri***su@qq.com
5年前 (2018-08-23)
#0hezhite
152***14785@163.com
参考地址
27关于 @FunctionalInterface 注解
Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
正确例子,没有报错:
@FunctionalInterface
interface GreetingService
void sayMessage(String message);
}
错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse 报错提示其不是函数式接口。
提醒:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法
函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
void sayMessage(String message);
default void doSomeMoreWork1()
// Method body
default void doSomeMoreWork2()
// Method body
}
函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
void sayMessage(String message);
static void printHello(){
System.out.println("Hello");
}
函数式接口里允许定义 java.lang.Object 里的 public 方法
函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
void sayMessage(String message);
@Override
boolean equals(Object obj);
}
hezhitehezhite
152***14785@163.com
参考地址
4年前 (2018-11-02)
#0xingjian long
tdl***tju.edu.cn
参考地址
3java.util.function 包
Java 8 的 java.util.function 包里面有很多内置的函数式接口。
Predicate : Predicate 接口包含一个抽象方法 test, test 方法会对输入的参数做一个评判,输出一个布尔值作为评判结果,至于评判的 criteria 交给具体的实现去做。Predicate 的函数原型如下:
public interface Predicate
public boolean test(T t);
}
BinaryOperator: 见名知意,BinaryOperator 是一个二元输入的函数式接口,它包含一个 apply 抽象方法,接收两个相同类型的参数,返回一个与输入类型相同的结果。
public interface BinaryOperator
public T apply(T x, T y);
}
Function: Function 接口有一个抽象方法 apply, 接收一个类型T的输入,返回一个类型 R 的结果。这个名字也很体现用途,Function 是函数的意思,函数的作用就是将定义域映射到值域的操作。这里 T 就是定义域,R 是值域。映射关系交给具体实现去定义。
public interface Function
{
public R apply(T t);
}
示例程序:
// A simple program to demonstrate the use
// of predicate interface
import java.util.*;
import java.util.function.Predicate;
class Test
public static void main(String args[])
// create a list of strings
List String names =
Arrays.asList("Geek","GeeksQuiz","g1","QA","Geek2");
// declare the predicate type as string and use
// lambda expression to create object
Predicate String p = (s)- s.startsWith("G");
// Iterate through the list
for (String st:names)
// call the test method
if (p.test(st))
System.out.println(st);
}
xingjian longxingjian long
tdl***tju.edu.cn
参考地址
3年前 (2019-11-13)
以上就是Java 8 函数式接口()的详细内容,想要了解更多 Java 8 函数式接口的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。