Java新特性:函数式接口

来源:互联网 发布:套路网络用语 编辑:程序博客网 时间:2024/06/06 16:29

相关文章:
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)的方法,接收一个输入参数并且没有返回值。
这里写图片描述

Predicate

Represents a predicate (boolean-valued function) of one argument.
接口表示一个接受单个输入参数并且返回值bool结果值(即判断输入的对象是否符合某个条件。)
这里写图片描述

当作为函数接口使用时,函数是指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).
这里写图片描述

函数式接口实例

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表达式使得整体的程序简单,清晰。

0 0
原创粉丝点击