不错的总结:
http://www.importnew.com/16436.html
http://www.blogjava.net/wangxinsh55/archive/2014/12/25/421826.html
简单记录下学习lamada使用方式的体会,lamada概念性的东西先不涉及。
java 7 内置的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.beans.PropertyChangeListener
除此之外,Java SE 8中增加了一个新的包:java.util.function
,它里面包含了常用的函数式接口,例如:
Predicate<T>
——接收T
对象并返回boolean
Consumer<T>
——接收T
对象,不返回值Function<T, R>
——接收T
对象,返回R
对象Supplier<T>
——提供T
对象(例如工厂),不接收值UnaryOperator<T>
——接收T
对象,返回T
对象BinaryOperator<T>
——接收两个T
对象,返回T
对象
一、实现runnable
int age = 26; //在这里,age就是Effectively final的局部变量
Runnable r = () -> System.out.println("My age is "+age);
new Thread(r).start();
二、实现callabel
Callable cc = ()->42;
三、使用Fuction
Function<Integer,Integer> f = (Integer x) -> x;
System.out.println(f.apply(5));
四、函数式接口
定义函数式接口:
注意,经过实践,此接口中,只能有一个方法,为啥呢?
@FunctionalInterface
interface SumLamada {
public int add(int x,int y);
}
使用函数接口:
/**
* 此处的实现需要特别规范,否则,即便是实现了和
* 方法名称相反的逻辑,语法上也没有问题,也就是说
* 一个接口方法,有n种实现,而且这些实现只在调用时可知
* 一般来讲,接口的实现方并不是调用方,这种用法要慎重
*/
SumLamada sl = (int x,int y)->x+y;
// SumLamada sl = (int x,int y)->x-y;
System.out.println(sl.add(5, 6));