? ?lamda 是Java8中增加的一个新特性。lamda表达式语法很简单,使用-> 将参数列表和表达式体分割开来。
? ? ? ? ? ? ? ? ? ? ?(Type1 param1, Type2 param2, ..., TypeN paramN) -> { //do somthing}
?
? ? ? (int x,int y)-> x+y ? 等价于 (int x,int y)->{x+y;}
?
如果有一个列表[1,2,3,4,5,6] 需要遍历并打印出来,如果不是用lamda表达式实现方式如下:
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(new Consumer<Integer>() { @Override public void accept(Integer t) { System.out.println(t); } });
?
而使用lamda表达式的写法则如下:
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(i->System.out.print(i));
? ?? ?当lambda表达式只是调用现有类中的具名方法时,编写lambda表达式更好的方式是使用已有的名字。
List<Integer> list=Arrays.asList(1,2,3,4,5,6); list.forEach(System.out::println);
? ? ? ? ?
? ? ? 静态方法 ? refType::staticMethod ? ? ?(args)->refType.staticMethod(args);
? ? ? 绑定实例 ? ?expr::instMethod ?
? ? ? 未绑定实例 ?RefType::instMethod
? ? ?构造器 ? ? ? ? ClsName::new
?
?
list.forEach(Integer::new); list.forEach(String::valueOf);
?
?
? ? ?
?
? ? ?通过上面的示例可以看到lamda可以和匿名内部类进行转换,当然不是所有内部类都可以替换为lamda表达式的,lamda表达式必须实现一个函数式接口(java.util.function);但是二者还是有很多显著却别的。
public class Hello { Runnable r1=()->{System.out.println(this);}; Runnable r2=new Runnable() { @Override public void run() { System.out.println(this); } }; public static void main(String ...args){ new Hello().r1.run(); new Hello().r2.run(); } }
??结果是:
com.david.demo.lamda.core.Hello@4eec7777 com.david.demo.lamda.core.Hello$1@3b07d329
?
java.util.function中提供的基本函数式接口有:
? void Consumer<T> (T t) ; ? 如:s->System.out.println(s);
? boolean Predicate<T>(T t); 如: s->s.isEmpty();
? T ? ? Supplier<T>(); ? ? ? ? ? ? 如: ()->new String();
? U ? ?Function<T,U>(T t); ? ? ? 如: s->new Integer(s);
?
原文:http://wujiu.iteye.com/blog/2300922