Java 8中如何使用方法引用

  介绍

本篇内容主要讲解“Java 8中如何使用方法引用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java 8中如何使用方法引用”吧!

在Java8中,使用方法引用非常简单,如字符串:isEmpty,但无法使用它否定的方法引用。本文内容即如何解决此问题使得我们能够更加全面地使用方法引用。

首先看一个使用方法引用的例子:

<节>
 Stream.of (“A",,,,,,“B") .filter(字符串:isEmpty) .count () 
  

上面代码的输出为1,即空字符串的数目。

<>之前如果我们想要获取非空字符串的数目,就不能直接使用方法引用了。 <节>
 Stream.of (“A",,,,,,“B") .filter (→s  ! s.isEmpty ()) .count () 
  
 <代码> 

Java8中的谓词,有predicate.negate()可以转换为断言的否定形式,但字符串:isEmpty却无法这么做(字符串:isEmpty.negate()或者!字符串::isEmpty)。

因为方法引用并不是一个λ或者函数接口,它能够被解析为一个或者多个函数接口,如字符串:isEmpty至少可以被解析如下:

<李>

Predicate

<李>函数

为了解决上述的问题,我们可以通过某种机制显式地将方法引用转换为一个函数接口:

<节>
 public  static  & lt; T>, Predicate,当(Predicate
   <>以前通过使用一个静态方法,接受方法引用参数,返回一个函数接口,即可实现方法引用到函数接口的转换,接着,我们就可以使用方法引用来实现上面例子中的获取非空字符串的数目.Stream.of (“A",,,,,,“B") .filter((字符串:isEmpty) .negate ()) .count (); 
 <代码> 

进一步还能使用各种组合的谓词。

<节>
 .filter((字符串:isEmpty) .negate (), (“A"::=)) 
   <>之前由于一个方法引用可能会被解析为多种函数接口,因此如果我们实现很多参数不同的像方法,那么很容易造成混淆。更好的方式则是在方法名中加入函数参数的类型来区分。 <节>
 

<代码>进口java.util.function。*; <代码>
<代码>公共类FunctionCastUtil{ <代码>,,公共静态& lt; T,标签;BiConsumer <代码>,,,代码,返回biConsumer; <代码>,代码,} <代码>,,公共静态& lt; T, U, R>BiFunctionasBiFunction (BiFunctionbiFunction){ <代码>,,,代码,返回biFunction; <代码>,代码,} <代码>,,公共静态& lt; T>BinaryOperatorasBinaryOperator (BinaryOperatorbinaryOperator){ <代码>,,,代码,返回binaryOperator; <代码>,代码,} <代码>,,公共静态& lt; T,标签;BiPredicate <代码>,,,代码,返回biPredicate; <代码>,代码,} <代码>,,公共静态BooleanSupplier asBooleanSupplier (BooleanSupplier BooleanSupplier){ <代码>,,,代码,返回booleanSupplier; <代码>,代码,} <代码>,,公共静态& lt; T>ConsumerasConsumer (Consumer消费者){ <代码>,,,,回报消费者; <代码>,代码,} <代码>,,公共静态DoubleBinaryOperator asDoubleBinaryOperator (DoubleBinaryOperator DoubleBinaryOperator){ <代码>,,,代码,返回doubleBinaryOperator; <代码>,代码,} <代码>,,公共静态DoubleConsumer asDoubleConsumer (DoubleConsumer DoubleConsumer){ <代码>,,,代码,返回doubleConsumer; <代码>,代码,} <代码>,,公共静态& lt; R>DoubleFunctionasDoubleFunction (DoubleFunctiondoubleFunction){ <代码>,,,代码,返回doubleFunction; <代码>,代码,} <代码>,,公共静态DoublePredicate asDoublePredicate (DoublePredicate DoublePredicate){ <代码>,,,代码,返回doublePredicate; <代码>,代码,} <代码>,,公共静态DoubleToIntFunction asDoubleToIntFunction (DoubleToIntFunction doubleToIntFunctiontem){ <代码>,,,代码,返回doubleToIntFunctiontem; <代码>,代码,} <代码>,,公共静态DoubleToLongFunction asDoubleToLongFunction (DoubleToLongFunction DoubleToLongFunction){ <代码>,,,代码,返回doubleToLongFunction; <代码>,代码,} <代码>,,公共静态DoubleUnaryOperator asDoubleUnaryOperator (DoubleUnaryOperator DoubleUnaryOperator){ <代码>,,,代码,返回doubleUnaryOperator; <代码>,代码,} <代码>,,公共静态& lt; T, R>FunctionasFunction (Function函数){ <代码>,,,代码,返回功能; <代码>,代码,} <代码>,,公共静态IntBinaryOperator asIntBinaryOperator (IntBinaryOperator IntBinaryOperator){

Java 8中如何使用方法引用