Java新特性:函数式接口

时间:2022-09-06 19:10:27

相关文章:
1.Lambda表达式
http://blog.csdn.net/youyou1543724847/article/details/52733395
2流
http://blog.csdn.net/youyou1543724847/article/details/52733477
3.函数式接口
http://blog.csdn.net/youyou1543724847/article/details/52733660
4.接口新特性
http://blog.csdn.net/youyou1543724847/article/details/52733675

下文参照:
http://www.tuicool.com/articles/beA7V3
http://www.runoob.com/java/java8-functional-interfaces.html

什么是函数接口

函数接口是一种只有一个方法的接口,像这样地,函数接口可以隐式地转换成lambda表达式。

java相关的类

包概要:java.util.function
作为Comparator 和Runnable早期的证明,在JDK中已经定义的接口恰巧作为函数接口而与lambdas表达式兼容。同样方式可以在你自己的代码中定义任何函数接口或第三方库。

但有特定形式的函数接口,且广泛的,通用的,在之前的JD卡中并不存在。大量的接口被添加到新的java.util.function 包中。下面是其中的一些:
• Function

Interface Consumer< T>

An operation which accepts a single input argument and returns no result. Unlike most other functional interfaces, Consumer is expected to operate via side-effects.
接口表示一个接受单个输入参数并且没有返回值的操作。不像其他函数式接口,Consumer接口期望执行带有副作用的操作(译者注:Consumer的操作可能会更改输入参数的内部状态)。

Consumer接口中有2个方法,有且只有一个声明为accept(T t)的方法,接收一个输入参数并且没有返回值。
Java新特性:函数式接口

Predicate

Represents a predicate (boolean-valued function) of one argument.
接口表示一个接受单个输入参数并且返回值bool结果值(即判断输入的对象是否符合某个条件。)
Java新特性:函数式接口

当作为函数接口使用时,函数是指test()方法
除了test()方法是抽象方法以外,其他方法都是默认方法(译者注:在Java 8中,接口可以包含带有实现代码的方法,这些方法称为default方法)。可以使用匿名内部类提供test()方法的实现,也可以使用lambda表达式实现test()。

Interface Function< T,R>

Represents a function that accepts one argument and produces a result.
This is a functional interface whose functional method is apply(Object).
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 + " ");
}
}
}
}
$ javac Java8Tester.java 
$ java Java8Tester
输出所有数据:
1
2
3
4
5
6
7
8
9
输出所有偶数:
2
4
6
8
输出大于 3 的所有数字:
4
5
6
7
8
9

总结:我觉得函数式接口的最大好处是结合lambda使用,使得函数也可以作为参数传递,同时,精简的lambda表达式使得整体的程序简单,清晰。