mpao
12/13/2017 - 9:43 PM

Esperimenti su Stream e Optional. Per Android è necessario minVersion = 24 ( Nougat 7.0 )

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

    }



}