java 数学表达式计算 ExpressionEvaluator_lambda

java 数学表达式计算 ExpressionEvaluator_抽象方法_02

 

 

 

可以在函数式接口上使用λ表达式,函数式接口就是只定义一个抽象方法的接口(函数式接口只可以定义一个抽象接口,但是可以定义多个默认方法)。

Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)。

 

@FunctionalInterface表示该接口被设计成一个函数式接口

java 数学表达式计算 ExpressionEvaluator_实例方法_03

java 数学表达式计算 ExpressionEvaluator_实例方法_04

 

 

请注意,任何函数式接口都不允许抛出受检异常(checked exception)。如果你需要Lambda表达式来 抛出异常,有两种办法:定义一个自己的函数式接口,并声明受检异常,或者把Lambda包在一个 try/catch块中。

3.6 方法引用

方法引用主要有三类。

(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)。

(2) 指向任意类型实例方法的方法引用(例如String的length方法,写作String::length)。

(3) 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction用于存放 Transaction类型的对象,它支持实例方法getValue,那么你就可以写 expensiveTransaction::getValue)。

 

3.8复合Lambda表达式的有用方法

3.8.1比较器复合

比较器:appleList.sort(Comparator.comparing(Apple::getWeight));

逆序:appleList.sort(Comparator.comparing(Apple::getWeight).reversed());

比较器链:appleList.sort(Comparator.comparing(Apple::getWeight).reversed().thenComparing(Apple::getColor));

3.8.2谓词复合

要么是重(150克以上)的红苹果,要么是绿苹果:

Predicate redAndHeavyAppleOrGreen = redApple.and(a -> a.getWeight() > 150) .or(a -> "green".equals(a.getColor())); ←─链接Predicate的方法来构造更复杂Predicate对象

3.8.3函数复合

Function接口为此配了andThen和 compose两个默认方法,它们都会返回Function的一个实例。

java 数学表达式计算 ExpressionEvaluator_函数式接口_05

 

3.10小结

Lambda表达式可以理解为一种匿名函数:它没有名称,但有参数列表、函数主体、返回类型,可能 还有一个可以抛出的异常的列表。

Lambda表达式让你可以简洁地传递代码。

函数式接口就是仅仅声明了一个抽象方法的接口。

只有在接受函数式接口的地方才可以使用Lambda表达式。

Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式 接口的一个实例。

Java 8自带一些常用的函数式接口,放在java.util.function包里,包括Predicate、 Function、Supplier、Consumer和BinaryOperator,如表3-2所述。

为了避免装箱操作,对Predicate和Function等通用函数式接口的原始类型特化: IntPredicate、IntToLongFunction等。

环绕执行模式(即在方法所必需的代码中间,你需要执行点儿什么操作,比如资源分配和清理)可以 配合Lambda提高灵活性和可重用性。

Lambda表达式所需要代表的类型称为目标类型。

方法引用让你重复使用现有的方法实现并直接传递它们。

Comparator、Predicate和Function等函数式接口都有几个可以用来结合Lambda表达式的默认 方法。