复合Lambda表达使用

Java8的好几个函数式接口都有为方便而设计的方法。具体而言,许多函数式接口,比如用于传递Lambda表达式的Comparator,Function和Predicate都提供了允许我们进行符合的方法。在实践中,这意味着可以把更多简单的Lambda复合成复杂的表达式。比如,可以让两个谓词之间做一个or操作,组合成一个更大的谓词。而且还可以让一个函数的结果称为另一个函数的输入。在函数式接口中引入默认方法,使接口符合规范,还能符合lambda

1.比较器复合

(1).逆序

如果想要对苹果按照重量进行递减排序怎么办?用不着去建立另一个Comparator的实例。接口有一个默认方法reversed可以使给定的比较器进行逆序

inventory.sort(comparing(Apple::getWeight).reversed());

(2).比较器链

上我们已经按照重量进行了排序,但是发现如果两个苹果一样重怎么办?那么怎么进行排序呢?所以我们可以进一步进行排序,可以按原产国进行排序。thenComparing方法就是做这个用的。它接收一个函数作为参数。如下:

inventory.sort(comparing(Apple::getWeight) 
 .reversed() 
 .thenComparing(Apple::getCountry));

2.谓语复合词

谓语接口包括三个方法:negate、and 、or,让我们重用已有的Predicate来创建复杂的谓词。比如,我们可以使用negate方法来返一个Predicate的非,如果苹果不使红的:

Predicate notRedApple = redApple.negate();

还可以进一步进行组合,比如一个苹果既是红的又比较重:

Predicate redAndHeavyApple = 
 redApple.and(a -> a.getWeight() > 150);

再进一步组合谓词,要么是重的红苹果(150克以上),要么是绿苹果:

Predicate redAndHeavyAppleOrGreen = 
 redApple.and(a -> a.getWeight() > 150) 
 .or(a -> "green".equals(a.getColor()));

从见简单Lambda表达式出发,可以构建更复杂的表达式。and和or方法是按照在表达式链中的位置,从左向右确定优先级。因此

a.or(b).and(c)可以看作(a||b)&&c。

3.函数复合

我们还可以把Function接口所代表的Lambda表达式复合起来。Function接口为此配了andThen和compose两个默认方法,它们都会返回Function的一个实例。

andThen方法会返回一个函数,它先对输入应用一个给定的函数,再对输出应用另一个函数。比如函数f是x->x+1,函数g是x->2*x,可以将他们组合成一个函数h,先给数字加1,再给结果乘2;

Function f = x -> x + 1; 
Function g = x -> x * 2; 
Function h = f.andThen(g); 
int result = h.apply(1);

数学上就是g(f(x))。

类似使用compose方法,先把给定函数用作compose的参数里面给的那个函数,然后再把函数本身用于结果。

Function f = x -> x + 1; 
Function g = x -> x * 2; 
Function h = f.compose(g);
int result = h.apply(1);

数学上类似f(g(x))

你可能感兴趣的:(java)