java8之λ表达式
目的:行为参数化
λ表达式是简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
λ的基本语法是(参数)→表达式或(参数)→{语句;}。其中(参数)→表达式的表达式中隐含了回报,如()→42;(参数)→{语句;}的花括号内是语句。
举例:
()→42//参数为空,返回一个int (List列表)→list.isEmpty()//参数为列表,返回一个布尔值 (int x, int y)→x * y//参数为两个int,返回一个int (String s)→System.out.println(年代);//参数为一个字符串,不返回结果 (String s)→{System.out.println(年代);}//参数为一个字符串,打印字符串
函数式接口是只定义一个抽象方法的接口,即使拥有多个默认方法.FunctionalInterface标注一个函数式接口,会加入编译检查。函数式接口中默认方法的目的是:改变已发布的接口而不破坏已有的实现。
在接受函数式接口为参数的地方,都可以使用λ表达式。
例子:
公共空间执行(可运行r) { r.run (); } 执行(()→{});//使用λ,运行的是参数为空,没有返回值的函数式接口,即()→无效//获取返回一个函数式接口,()→字符串 公共Callablefetch () { 返回()→“棘手的例子;-)”; }
为什么只有在函数式接口的地方使用呢?λ表达式没有函数名,只有参数列表,函数主体和返回值,如果接口有多个方法,就不能直接匹配到正确的方法上了,所以,只有一个抽象方法的函数式接口可以满足。
谓词 java.util.function.Predicate
FunctionalInterface 公共接口Predicate{//接口方法,入参为泛型T,返回bool。即:T (T)→保龄球 布尔测试(T T);//默认方法,操作 默认Predicate 和(Predicate<& # 63;超级T>其他){ Objects.requireNonNull(其他); 返回(t)→测试(t),,other.test (t); }//默认方法,取反操作 默认Predicate 否定(){ 返回(t)→!测试(t); }//默认方法、操作 默认Predicate 或(Predicate<& # 63;超级T>其他){ Objects.requireNonNull(其他); 返回(t)→测试(t) | | other.test (t); }//默认方法,判断是否相等 静态& lt; T>Predicate isEqual(对象targetRef) { 返回(null==targetRef) & # 63;对象:isNull :对象→targetRef.equals(对象); }
使用
Predicate! s.isEmpty ();nonEmptyStringPredicate=(String s)→
消费者
java.util.function.Consumer
@FunctionalInterface 公共接口Consumer{//接口方法,入参为泛型T,返回空白。即:T (T)→无效 空白接受T (T);//默认方法,可以执行级联操作 默认Consumer 然后(Consumer<& # 63;超级T>后){ Objects.requireNonNull(后); 返回(T T)→{接受(t);after.accept (t);}; }
函数
java.util.function.Function
@FunctionalInterface 公共接口Function{//接口方法,入参为泛型T,返回泛型r .即:T (T)→R 应用R T (T);//默认方法,实现级联操作.before方法输入V,输出T,本函数输入T,输出R。 默认& lt; V>Function 组成(Function<& # 63;超级V & # 63;T>延伸;){ Objects.requireNonNull(之前); 返回(V V)→应用(before.apply (v)); }//默认方法,级联操作 默认& lt; V>Function 然后(Function<& # 63;超级R & # 63;V>延伸;后){ Objects.requireNonNull(后); 返回(T T)→after.apply(应用(t)); }//默认方法,输入啥,输出啥 静态& lt; T>Function 身份(){ 返回t→t; }
特定方法避免装箱操作
在处理数据时,使用特定方法,可以避免装箱操作,如:IntPredicate, LongConsumer, DoubleFunction等。具体见API库。
总结 函数描述符 函数式接口 (T)→保龄球