Java8函数式接口和Lambda表达式

时间:2022-05-30 19:00:19

两者关系:

Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作为方法的参数也是可以的。

 

函数式接口只有一个抽象方法,并且没有重写Object类中的方法(Object类中的public的方法除外),可以有默认方法和静态方法。

函数式接口一般用注解@FunctionalInterface标注。

例子:

1、声明一个函数式接口

@FunctionalInterface
public interface Calculator { double calculate(int a, int b); }

2、使用Lambda表达式(参数类型可省略) 

Calculator division  = (int a, int b) -> (double) a / b;
System.out.println(division.calculate(5, 2)); // prints 2.5

另一个例子(使用jdk标准库内的函数式接口,下滑至文末查看更多):

Function<Integer, Integer> selfIncrease = x -> x + 1;
Function<Integer, Integer> twiceValue = x -> 2*x;
Consumer<Integer> printNum = x -> System.out.println("2x+1:"+selfIncrease.apply(x)); 

int [] numbers= {1, 2, 3};
Arrays.stream(numbers).boxed().map(twiceValue).forEach(printNum);
System.out.println("通过表达式后的数组:"+Arrays.toString(numbers));

输出:

2x+1:3

2x+1:5

2x+1:7

通过表达式后的数组:[1, 2, 3]

 

3、使用Lambda表达式作为方法参数

public static void main(String[] args) throws Exception {
        execute(a -> String.valueOf(a + 1), 10);
    }

    public static void execute(Function<Integer, String> func, int num) {
        System.out.println(func.apply(num));
    }

4、问题

  • 标准库内没有提供支持更多参数的函数式接口
  • lambda表达式中引用到的变量需要实际是final
// 编译通过
public static void main(String[] args) throws Exception {
    int num = 10;
    Function<Integer, Integer> lambda = x -> x + num;
}

// 编译错误
public static void main(String[] args) throws Exception {
    int num = 10;
    num += 1;
    Function<Integer, Integer> lambda = x -> x + num;
}

 5、函数式接口

http://www.cnblogs.com/IcanFixIt/p/4284418.html

函数式接口

描述

Function

传递一个参数返回一个结果。这个结果的类型可以与参数的类型不相同。

BiFunction

传递两个参数返回一个结果。这个结果的类型可以与任一参数的类型不相同。

UnaryOperator

代表一个操作符的操作,它的返回结果类型与操作符的类型一样。实际上它可以被看作是Function 它的返回结果跟参数一样,它是Function 的子接口。

BiOperator

代表两个操作符的操作,它的返回结果类型必须与操作符相同。

Predicate

传递一个参数,基于参数的值返回boolean值。

Supplier

代表一个供应者的结果。

Consumer

传递一个参数但没有返回值。

具体使用可以查看jdk源码里的抽象方法的方法返回值,方法参数,以及函数式接口定义说明。

 

参考:

http://www.cnblogs.com/IcanFixIt/p/4284418.html

http://blog.soliloquize.org/2015/07/07/Java-8%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B%E4%B8%80/