如何在java 8 stream api中使用guava Predicates作为过滤器

Chr*_*iss 6 java collections guava java-8 java-stream

Guava Predicates不能作为java 8 streaming API的过滤器使用.

例如,这是不可能的:

Number first = numbers.stream()
    .filter( com.google.common.base.Predicates.instanceOf(Double.class)))
    .findFirst()
    .get();
Run Code Online (Sandbox Code Playgroud)

当guava谓词转换为java 8谓词时,如何可能,如下所示:

public static <T> Predicate<T> toJava8(com.google.common.base.Predicate<T> guavaPredicate) {
  return (e -> guavaPredicate.apply(e));
}

Number first = numbers.stream()
    .filter( toJava8( instanceOf(Double.class)))
    .findFirst()
    .get();
Run Code Online (Sandbox Code Playgroud)

问题:有没有更优雅的方法在java 8中重用guava Predicates?

wer*_*ero 15

applyGuava谓词方法的方法句柄是一个可用作过滤器的功能接口:

Number first = numbers.stream()
    .filter(Predicates.instanceOf(Double.class)::apply)
    .findFirst()
    .get();
Run Code Online (Sandbox Code Playgroud)

  • 解释有点奇怪,可能是由于问题的错误引入.Guava的`Predicate`接口*是一个功能接口,但这在这里完全无关紧要.你不能将一个Guava的`Predicate`实例直接传递给一个期望Java 8的'Predicate`的方法,因为它们只是两个完全不同的类型,无论是否有效.但是你可以通过一个方法句柄实现Java 8的`Predicate`,因为Java 8的`Predicate`是一个功能接口.它不是作为功能接口的方法句柄. (6认同)
  • 恕我直言,使用Double.class :: isInstance看起来更干净 (4认同)
  • @ Jean-FrançoisSavard对于这个具体案例:是的,当然.但问题是如何重用任何Guava谓词,`instanceof`只是一个(次优)的例子. (3认同)