java8之λ表达式用法总结

  

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是一个含有多个默认方法的函数式接口,抽象方法为:T (T)→bool。看下代码,你就懂了~

        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>PredicateisEqual(对象targetRef) {   返回(null==targetRef)   & # 63;对象:isNull   :对象→targetRef.equals(对象);   }      

使用         PredicatenonEmptyStringPredicate=(String s)→ ! s.isEmpty ();      

  消费者

  

java.util.function.Consumer是一个只含有一个默认方法的函数式接口,抽象方法为:T (T)→空白。看下代码,你就懂了~

        @FunctionalInterface   公共接口Consumer{//接口方法,入参为泛型T,返回空白。即:T (T)→无效   空白接受T (T);//默认方法,可以执行级联操作   默认Consumer然后(Consumer<& # 63;超级T>后){   Objects.requireNonNull(后);   返回(T T)→{接受(t);after.accept (t);};   }      

函数   

java.util.function.Function是一个含有多个默认方法的函数式接口,抽象方法为:T (T)→r .看下代码,你就懂了~

        @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)→保龄球   

java8之λ表达式用法总结