import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

public class Flatmap {


    public void flatMapExample() {
        System.out.println("Flatmap:");
        List<Foo> foos = new ArrayList<>();
        IntStream
                .range(1,4)
                .forEach(i->foos.add(new Foo("Foo"+i)));

        for(Foo f : foos) {
            System.out.println("Foo: " + f.name + " " + f.bars);
        }
        //or
        foos.stream().forEach(f->System.out.println("Foo is: "+ f.name + " " + f.bars));


        foos.forEach(f->
                IntStream
        .range(1,4)
        .forEach(i->f.bars.add(new Bar("Bar" + i + " <- " + f.name))));

        //Detta ger oönskad ordning på utskriften:
        foos.stream().forEach(f->System.out.println("Foo : "+ f.name + " has " + f.bars.size() + " bars."));
        foos.stream().forEach(f->System.out.println("The first bar for "+ f.name + " is: " + f.bars.get(0).name));
        //Gör istället så här:
        foos
                .stream()
                .forEach(f-> {
                            System.out.println("Foo "+ f.name + ":");
                            System.out.println("No of bars: "+ f.bars.size());
                            System.out.println("The first bar is: " + f.bars.get(0).name);
                        }
                    );

        System.out.println("Instead use flatmap:");
        foos.stream()
                .flatMap(f->f.bars.stream())
                .forEach(b->System.out.println(b.name));
    }


    class Foo {
        String name;
        List<Bar> bars = new ArrayList<>();
        Foo(String name) {
            this.name=name;
        }
    }

    class Bar {
        String name;
        Bar(String name) {
            this.name=name;
        }
    }
}
