Esperimenti su Stream e Optional. Per Android è necessario minVersion = 24 ( Nougat 7.0 )
import java.util.*;
import java.util.stream.Stream;
/**
* Playgroud per Stream e Optional.
* Tristi notizie per Android, dove è utilizzabile da
* Nougat 7.0 API level 24
*/
public class Main {
public static void main(String[] args){
MyData a = new MyData("The Answer", 42);
MyData b = new MyData("Another Value", 7);
MyData c = new MyData("Last Value", 12);
List<MyData> list = new ArrayList<>(Arrays.asList(a,b,c));
// lista come stream, filtro per cercare un nome, e per
// ogni risultato ottenuto scrivo qualcosa
list.stream()
.filter( s -> s.getName().equals("The Answer") )
.forEach( s -> System.out.println(s.getName() ) );
// dallo stream ricava un nuovo stream di double applicando
// la funzione passata come parametro. Su questo nuovo stream
// faccio la media e mando in stampa se non nulla
list.stream()
.mapToDouble( MyData::getNumber )
.average()
.ifPresent(System.out::println);
// stessa cosa di prima, ma questa volta salvo l'OptionalDouble
// e mando in output il valore, e se nullo mando output 0
OptionalDouble m = list.stream()
.mapToDouble( MyData::getNumber )
.average();
System.out.println( "m = "+ String.valueOf(m.orElse(0)));
// trasformo la lista in uno stream, e filtro cercando un valore
// attraverso la relativa funzione. Dopo di che ricreo lo stream
// dei valori trovati e ne prendo il primo valore, mandandolo in output
Optional<String> son = list.stream()
.filter( s -> s.getName().equals("This is missing"))
.map(MyData::getName)
.findFirst();
System.out.println( son.orElse("Not Found") );
// flatMap è più complicato, leggi doc, che contiene anche esempi
// The flatMap() operation has the effect of applying a one-to-many
// transformation to the elements of the stream, and then flattening
// the resulting elements into a new stream.
// Se l'oggetto MyData, contiene una qualche collezione, con flatMap
// posso ottenere un nuovo stream concatenando tutte queste collezioni
// e operare poi come negli esempi precedenti
Stream.of(a,b,c)
.flatMap( myData -> myData.flatting.stream() )
.map(String::toUpperCase)
.forEach(System.out::println);
}
}