两者关系:
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源码里的抽象方法的方法返回值,方法参数,以及函数式接口定义说明。