当前位置: 首页 > 科技观察

在Java中--

时间:2023-03-15 16:00:28 科技观察

1的这个符号是什么。前言很多同学都见过Java中的方法引用,但叫不出名字。在本文中,我们将了解什么是方法引用以及如何使用它。2、方法引用的使用场景我们先看一下方法引用的用法:newRandom().ints(10).map(i->Math.abs(i)).forEach(i->System.out.println(我));这里我们随机生成10个整数,然后取它们的绝对值,一一打印出来。写法没有问题,但还是可以简化的。map方法接受一个函数式接口IntUnaryOperator,那么上面代码中的i->Math.abs(i)其实就是:newIntUnaryOperator(){@OverridepublicintapplyAsInt(intoperand){returnMath.abs(operand);}}从上面可以可以看出IntUnaryOperator是Math.abs(inti)的代理,参数列表和返回值是一样的,没有其他额外的逻辑。这个很重要,不用混其他逻辑就可以替换。然后可以通过方法引用简化Lambda表达式。上述公式可以简化为:newRandom().ints(10).map(Math::abs).forEach(System.out::println);3.方法引用Java方法引用是Java8和Lambda表达式引入的新特性。可以直接引用现有Java类或对象的方法或构造函数。方法引用通常与Lambda表达式结合使用以简化代码。它的使用条件是:Lambda表达式的主体只包含一个表达式,并且Lambda表达式只调用一个已有的方法;被引用方法的参数列表和返回值与Lambda表达式的输入输出一致。3.1格式方法引用的格式是::<方法名称>。也就是说,被引用方法的类名和方法名之间用双冒号隔开::。构造函数方法是一个例外。将使用new关键字作为参考。总结一下:引用方法描述静态方法引用ClassName::staticMethodName如上Math::abs构造函数引用ClassName::new例如通过Supplier返回类的新实例,任何实例方法引用ClassName::instanceMethodName例如String::concat特定于类的实例方法引用instance::instanceMethodName例如这::等于4。关于可读性,大多数人认为Lambda表达式很难阅读。事实上,这种流水线结构只是增加了可读性。每个Lambda表达式都可以看作是一个执行策略,方法引用更易于阅读。您可以更加了解执行了什么策略。另外经常看到stream这样写:newRandom().ints(10).map(operand->{System.out.println("operand="+operand);returnoperand+1;}).forEach(系统.out::println);这种“大肚腩”的写法,在函数式编程中是不推荐的。最好拿出一个单独的封装方法参考,写成如下风格:publicvoidrandomInt(){newRandom().ints(10).map(this::selfIncreasing).forEach(System.out::println);}//封装privateintselfIncreasing(intself){System.out.println("self="+self);returnsself+1;}这个可读性很强,随机取10个数,然后每个数自增增加和打印出来。5.总结方法参考实现了Lambda表达式在特定场景下的简化表示,目的是让代码更加简洁。但是,习惯了传统的Java编程风格的同学,将无法适应。我希望这篇文章可以帮助你解决这个问题。