当前位置: 首页 > 后端技术 > Java

DeadlyLambdaexpression(6)-Consumer,Predicate,Functioncompound

时间:2023-04-02 00:47:59 Java

你的无畏来自于无知。——《三体》上篇文章(传送门)介绍了Comparator复合,本次介绍其他复合Lambda表达式。在Consumer复合Consumer接口中,有一个默认方法andThen,其入参仍然是Consumer接口的一个实例。完成上一个Consumer的操作后,再做当前Consumer的操作,就像工厂的流水线一样,例如:Consumerbrand=m->m.setBrand("3M");Consumertype=m->m.setType("N95");Consumerprice=m->m.setPrice(19.9);Consumerprint=System.out::println;brand.andThen(类型).andThen(价格).andThen(打印).accept(newMask());上面代码声明了4个Consumer接口的实例,然后组装成一个pipeline,先把口罩品牌赋值给3M,然后赋值口罩类型是N95,再把口罩的价格赋值给19.9,最后打印出mask实例,运行结果如下:Mask{brand='3M',type='N95',price=19.9}Predicate复合Predicate接口中有3个默认方法:negate,andandor,可以用于创建更复杂的Predicate接口实例。negate方法negate方法是做一个非操作。例如判断口罩类型是N95:Maskmask=newMask("Honeywell","N95",19.5);PredicateisN95=m->"N95".equals(m.getType());System.out.println(isN95.test(mask));运行结果为:true那么使用negate方法后,就变成判断口罩类型不是N95:Maskmask=newMask("Honeywell","N95",19.5);PredicateisN95=m->"N95".equals(m.getType());System.out.println(isN95.negate().test(mask));运算结果为:false方法和方法是做AND运算。例如:Maskmask=newMask("Honeywell","N95",19.5);PredicateisN95=m->"N95".equals(m.getType());PredicatelessThan20=m->m.getPrice()<20.0;System.out.println(isN95.and(lessThan20).test(mask));以上代码分别声明了Predicate接口的两个实例,分别是判断口罩类型是否为N95和判断口罩价格是否小于20。使用and方法后表示口罩类型为N95,口罩price小于20,运行结果如下:trueor方法或方法是做or运算。例如:Maskmask=newMask("Honeywell","N95",21.5);PredicateisN95=m->"N95".equals(m.getType());PredicatelessThan20=m->m.getPrice()<20.0;System.out.println(isN95.or(lessThan20).test(mask));以上代码分别声明了Predicate接口的两个实例,分别是判断口罩类型是否为N95和判断口罩价格是否小于20。使用or方法后表示口罩类型为N95或价格mask的小于20,运行结果如下:trueand方法和or方法结合使用。and方法和or方法结合使用时,优先级由Lambda表达式链中的位置决定,优先级从左到右从高到低,例如:Maskmask=new口罩("3M","N95",21.5);Predicateis3M=m->"3M".equals(m.getType());PredicateisN95=m->"N95".equals(m.getType());PredicatelessThan20=m->m.getPrice()<20.0;System.out.println(is3M.or(isN95).and(lessThan20).test(mask));以上代码分别声明了Predicate接口的3个实例,分别是判断口罩品牌是否为3M、判断口罩型号是否为N95、判断口罩价格是否低于20。3个Predicate组合为3M.or(isN95).and(lessThan20).按照从左到右的优先级,组合后的逻辑为(is3M||isN95)&&lessThan20,所以运行结果如下:falseFunctioncompoundFunction接口默认有两个方法,分别是:andThen和compose,可以用来创建更复杂的Function接口实例andThen方法Function接口的andThen方法和Consumer接口类似,它的入参仍然是Consumer接口的实例函数接口。完成上一个Function的运算后,再进行当前Function的运算,例如:FunctionplusTwo=x->x+2;FunctiontimesThree=x->x*3;系统。out.println(plusTwo.andThen(timesThree).apply(1));System.out.println(plusTwo.andThen(timesThree).apply(2));System.out.println(plusTwo.andThen(timesThree).apply(3));上面代码声明了两个Function接口的实例,先加2,再乘以3,即(x+2)*3,运行结果如下:91215composemethodFunction接口的compose方法,相反andThen方法,先执行当前Function的操作,再执行上一个Function的操作,例如:FunctionplusTwo=x->x+2;FunctiontimesThree=x->x*3;System.out.println(plusTwo.compose(timesThree).apply(1));System.out.println(plusTwo.compose(timesThree).apply(2)));System.out.println(plusTwo.compose(timesThree).apply(3));上面代码声明了两个Function接口的实例,先乘以3,再加2,即(x*3)+2,运行结果如下:5811