2016-02-29 24 views
5

Guava Predicates non può essere utilizzato fuori dalla scatola come filtro con la Java 8 Streaming API.Come usare predicati guava come filtro nel flusso di Java API 8

UE Questo non è possibile:

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

How mai ce ne è possibile quando il predicato guava viene convertito in un Java 8 predicate, come questo:

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(); 

QUESTION: Is c'è un modo più elegante per riutilizzare i predicati di guava in java 8?

+7

Basta usare '.filter (Double.class :: isinstance)' - senza involucro necessario . –

+2

Perché pensi che "Predicate" non sia un'interfaccia funzionale? – zeroflagL

+0

Il predicato di guaiave contiene 2 metodi, un'interfaccia funzionale deve averne uno. Ma questo non è un problema qui, perché il secondo metodo è "uguale". L'ho trascurato. – Chriss

risposta

14

La maniglia metodo per il metodo del predicato Guava apply è un'interfaccia funzionale che può essere usato come filtro:

Number first = numbers.stream() 
    .filter(Predicates.instanceOf(Double.class)::apply) 
    .findFirst() 
    .get(); 
+4

IMHO sembra più pulito con Double.class :: isinstance –

+3

@ Jean-FrançoisSavard Per questo caso specifico: sì, certo. Ma la domanda è su come riutilizzare qualsiasi predicato di Guava, 'instanceof' è solo un esempio (subottimale). – wero

+0

quindi il mio upvote. –