import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ConvertingListsToArrays {

    public static void convertingArraysToLists() {
        int[] intArray = {1,2,3};
        System.out.println("Original int array " + intArray[0]+ " " + intArray[1] + " " + intArray[2]);

        //Converting to List<Integer> using java 7. Not so much code, but not java 8...
        List<Integer> list = new ArrayList<>();
        for(int i: intArray) {
            list.add(i);
        }
        System.out.println("To Integer list using Java 7: "  + list);

        //So, how use Java 8?!?!
        //------------------------

        //Converting to list of int
        List<int[]> list2 = Arrays.asList(intArray);
        System.out.println("To list of int[], not desired..." + list2);

        //Converting to list of Integers
        List<Integer> l = Arrays.asList(5,1,2,3,4,5,1); //Nice, but this is NEITHER an int[] NOR Java 8...
        System.out.println("Not what I wanted " + l);

        //Creating a list of Integers out of a range, via IntStream
        List<Integer> convertedList = IntStream
                .range(1,5)
                .mapToObj(i->i)
                .collect(Collectors.toList());
        System.out.println("ConvertedList out of a range 1-5): " + convertedList);

        //Converting an int[] to List<Integer>:
        int[] arr = new int[] {1,2,3};
        List<Integer> lll = Arrays.stream(arr)
                .mapToObj(i->i)
                .collect(Collectors.toList());
        System.out.println("*** This is actually using java 8: " + lll);

        List<Integer> odds = Arrays.stream(arr)
                .filter(i->i%2>0)
                .mapToObj(i->i)
                .collect(Collectors.toList());
        System.out.println("Creating list of all odd numbers in an int[]" + odds);
    }

    public static void convertingListToArrays() {
        List<String> list = new ArrayList<>();
        list.add("hej");
        list.add("då");
        System.out.println("Original list of Strings: "+ list);

        //Converting to String[] with java 7:
        String[] s = list.toArray(new String[list.size()]);
        System.out.println("Java 7: " + s[0] + s[1]);

        //Converting to String[] with java 8:
        String[] s2 = list.stream().toArray(String[]::new);
        System.out.println("java 8: " + s2[0] + s2[1]);


        List<Integer> list2 = Arrays.asList(1,2);
        System.out.println("Original Integer list2: " + list2);
        list2.stream().forEach(System.out::println);

        //Converting to Integer[] with java 7:
        Integer[] integerArray7 = list2.toArray(new Integer[list2.size()]);
        System.out.println("java 7 Integer: " +integerArray7[0] + " " + integerArray7[1]);

        //Converting to int[] with java 7:
        int[] intArray7 = new int[list2.size()];
        for(int i=0; i<list2.size();i++) {
            intArray7[i]=list2.get(i);
        }
        System.out.println("java 7 int: " +intArray7[0] + " " + intArray7[1]);

        //Converting to Integer[] with java 8:
        Integer[] integerArray = list2.stream().toArray(Integer[]:: new);
        System.out.println("java 8 Integer: " +integerArray[0] + " " + integerArray[1]);

        //Converting to int[] with java 8:
        int[] intArray = list2.stream().mapToInt(i->i).toArray();
        System.out.println("java 8 int: " + intArray[0] + " " + intArray[1]);
    }

    public static void main (String[] args) {

        convertingListToArrays();
        convertingArraysToLists();
    }

}
