2016-02-24 16 views
7

Ho appena iniziato a lavorare con Java 8. Vedo molti stream e opzionali. Una domanda mi è venuta in mente. Si consideri il seguente esempio tratto da this oracle tutorial:Report di copertura in Java 8

String name = computer.flatMap(Computer::getSoundcard) 
          .flatMap(Soundcard::getUSB) 
          .map(USB::getVersion) 
          .orElse("UNKNOWN"); 

O il prossimo tratto da here:

List<String> myList = new ArrayList(); 

myList 
    .stream() 
    .filter(s -> s.startsWith("c")) 
    .map(String::toUpperCase) 
    .sorted() 
    .forEach(System.out::println); 

C'è qualche soluzione di copertura, che mi può dire se il orElse nel primo frammento è stato utilizzato? O qualche altro, che mi dice che la chiusura filter non è stata chiamata affatto, dal momento che la lista era vuota? È possibile segnalare che il metodo di riferimento in forEach non è stato utilizzato?

+0

L'utilizzo dei dati per il test aggiungere un optional senza alcun valore e controllare che appaiono sconosciute. – JEY

+1

L'invocazione 'orElse' avverrà sempre e l'argomento viene sempre valutato prima che avvenga l'invocazione, quindi la sua copertura non richiede alcuna valutazione. Nel caso di espressioni lambda, vengono sottoposte a metodi sintetici durante la compilazione, quindi anche ogni copertura del codice aggiornata dovrebbe essere in grado di gestirle. – Holger

+3

È garantito che qualsiasi operazione in una "pipeline" verrà colpita quando si utilizza un'operazione "terminale" sul flusso. Quindi non c'è davvero bisogno di copertura. – fge

risposta

1

Almeno Clover sembra supportare la copertura per chiusure. Vedi l'articolo del blog this!

Esempio in IntelliJ:

enter image description here