java函数式接口

什么是函数式接口

java语言设计者投入了大量精力来思考如何使现有的函数友好地支持lambda。最终采取的方法是:增加函数式接口的概念。函数式接口就是一个具有一个方法的普通接口。像这样的接口,可以被隐式转换为lambda表达式。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的两个例子。在实际使用过程中,函数式接口是容易出错的:如有某个人在接口定义中增加了另一个方法,这时,这个接口就不再是函数式的了,并且编译过程也会失败。为了克服函数式接口的这种脆弱性并且能够明确声明接口作为函数式接口的意图,Java 8增加了一种特殊的注解@FunctionalInterface(Java 8中所有类库的已有接口都添加了@FunctionalInterface注解)。让我们看一下这种函数式接口的定义:

@FunctionalInterface
public interface Functional {
    void method();
}

需要注意的是,默认方法与静态方法以及重写Object对象的方法并不影响函数式接口的契约。

lamda和函数式接口的搭配使用

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Test {
    public static void main(String args[]){
          List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
            
          // Predicate predicate = n -> true
          // n 是一个参数传递到 Predicate 接口的 test 方法
          // n 如果存在则 test 方法返回 true
            
          System.out.println("输出所有数据:");
            
          // 传递参数 n
          eval(list, n->true);
            
          // Predicate predicate1 = n -> n%2 == 0
          // n 是一个参数传递到 Predicate 接口的 test 方法
          // 如果 n%2 为 0 test 方法返回 true
            
          System.out.println("输出所有偶数:");
          eval(list, n-> n%2 == 0 );
            
          // Predicate 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 list, Predicate predicate) {
          for(Integer n: list) {
            
             if(predicate.test(n)) {
                System.out.println(n + " ");
             }
          }
       }
}

执行结果:

输出所有数据:
1 
2 
3 
4 
5 
6 
7 
8 
9 
输出所有偶数:
2 
4 
6 
8 
输出大于 3 的所有数字:
4 
5 
6 
7 
8 
9 

作者 @没有故事的老大爷
人活着是为了活着本身而活着的,而不是为了活着之外的任何事物活着的。

你可能感兴趣的:(java函数式接口)