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

致命的Lambda表达式(三):更简洁的Lambda

时间:2023-04-01 15:14:56 Java

我们都是阴沟里的虫子,但还是要有人仰望星空。——《三体》在上一篇文章中,我介绍了Lambda表达式的基本语法和正确的使用姿势。这次我将介绍一些更简洁的Lambda用法。类型推断编译器可以通过函数式接口推断出Lambda表达式的参数类型,因此在编写Lambda表达式时,可以省略参数类型。例如:Comparatorcomparator=(Masko1,??Masko2)->o1.getBrand().compareTo(o2.getBrand());可以简写为:Comparatorcomparator=(o1,o2)->o1.getBrand().compareTo(o2.getBrand());另外,当Lambda表达式只有一个参数时,不仅参数类型可以省略,参数名两边的括号也可以省略,如:Predicatepredicate=(Maskmask)->mask.getType()=="N95";可以简写为:Predicatepredicate=mask->mask.getType()=="N95";方法参考什么是方法参考?方法引用是Java8引入的新特性。它提供了一种在不执行方法的情况下引用方法的方法。它允许我们重用当前方法的定义,作为编写某些Lambda表达式的另一种更简洁的方式。.比如前面的例子:Comparatorcomparator=(o1,o2)->o1.getBrand().compareTo(o2.getBrand());使用方法引用后,可以简写为:Comparatorcomparator=Comparator。比较(面具::getBrand);当需要方法引用时,目标引用放在separator::之前,方法名放在separator::之后。比如上面的Mask::getBrand就是指Mask中定义的getBrand方法。方法名后不需要括号,因为我们实际上并没有调用它。方法引用提高了代码的可读性,使逻辑更加清晰。如何构造方法引用?可以构造方法引用的场景有四种:1、静态方法指向静态方法引用,语法:类名::静态方法名,类名放在分隔符::之前,:static方法名放在as分隔符::返回。例如:(Stringstr)->Integer.parseInt(str)使用方法引用后,可以简写为:Integer::parseInt2。内部对象的实例方法指向Lambda表达式的内部对象实例方法的引用,语法:类名::实例方法名,类名放在分隔符::之前,和:实例方法名称放在分隔符::之后。例如:(Maskmask)->mask.getBrand()使用方法引用后,可以简写为:Mask::getBrand3。外部对象的实例方法指向Lambda表达式的外部对象实例方法的引用,语法:实例名::实例方法名,类名放在分隔符::之前,和:实例方法名放在分隔符::之后。例如:Stringtype="N95";Predicatepredicate=(Stringstr)->type.equals(str);System.out.println(predicate.test("N95"));其中,type是一个Lambda表达式外的局部变量,可以简写为:Stringtype="N95";Predicatepredicate=type::equals;System.out.println(predicate.test("N95"));如果您不熟悉Predicate接口,也没关系。将在以后的文章中介绍。暂时知道它的抽象方法的签名是(T)->boolean就够了。4.构造方法是指构造方法的引用,语法:类名::new,类名放在分隔符::之前,new放在分隔符::之后。例如:(Stringbrand,Stringtype)->newMask(brand,type)使用方法参考后,可以简写为:Mask::new看了这么多小测试,你准备好试一试了吗?我们来做几个小测试:(char[]array)->newString(array)(Stringstr)->str.length()(Stringtype)->mask.setType(type),其中mask是一个LocalMask对象的变量。(Stringstr)->System.out.println(str)请思考一下...公布答案:因为(char[]array)->newString(array)是构造方法的Lambda表达式,此方法引用的语法为:类名::new,因此正确答案为:String::new。因为(Stringstr)->str.length()是一个内部对象实例方法的Lambda表达式,所以这个方法引用的语法是:类名::实例方法名,所以正确答案是:String::长度。因为(Stringtype)->mask.setType(type)中的mask是Mask对象的局部变量,是一个包含外部对象的Lambda表达式,所以这个方法引用的语法是:实例名::实例方法名,所以正确答案是mask::setType。因为(Stringstr)->System.out.println(str)是一个静态方法的Lambda表达式,所以这个方法引用的语法是:类名::静态方法名,所以正确答案是System.out::打印。这个怎么样?你没事儿吧?