import java.util.*;
import java.util.stream.Stream;
import java.util.stream.IntStream;

class Lab9 {
	public static void main(String[] args) {

		ArrayList<Integer> list = new ArrayList<>();
		for(int i = 0; i < 20; i++) {
			list.add((int) ((Math.random() * 20) + 1));
		}

		System.out.print("list: ");
		list.stream().forEach(Lab9::print);
		System.out.println();

		System.out.println("count: " + list.stream().count());

		System.out.print("sorted: ");
		list.stream().sorted(Integer::compare).forEach(Lab9::print);
		System.out.println();

		System.out.print("reverse sorted: ");
		list.stream().sorted(Comparator.reverseOrder()).forEach(Lab9::print);
		System.out.println();

		System.out.print("distinct: ");
		list.stream().distinct().forEach(Lab9::print);
		System.out.println();

		System.out.println("distinct count: " + list.stream().distinct().count());	

		System.out.println("max: " + list.stream().max(Integer::compare).get());	

		System.out.println("min: " + list.stream().min(Integer::compare).get());	

		System.out.print("last 5: ");
		list.stream().skip(15).forEach(Lab9::print);
		System.out.println();

		System.out.print("last 5 sorted: ");
		list.stream().skip(15).sorted(Integer::compare).forEach(Lab9::print);
		System.out.println();

		System.out.print("largest 5: ");
		list.stream().sorted(Integer::compare).skip(15).forEach(Lab9::print);
		System.out.println();

		System.out.print("smallest 5: ");
		list.stream().sorted(Comparator.reverseOrder()).skip(15).forEach(Lab9::print);
		System.out.println();

		System.out.print("even: ");
		list.stream().filter((i) -> i % 2 == 0).forEach(Lab9::print);
		System.out.println();

		System.out.print("even gt 10: ");
		list.stream().filter((i) -> i % 2 == 0 && i > 10).forEach(Lab9::print);
		System.out.println();

		System.out.print("sorted even gt 10: ");
		list.stream().filter((i) -> i % 2 == 0 && i > 10).sorted(Integer::compare).forEach(Lab9::print);
		System.out.println();

		System.out.println("even gt 10 count: " + list.stream().filter((i) -> i % 2 == 0 && i > 10).count());

		System.out.println("no even: " + list.stream().noneMatch((i) -> i % 2 == 0));

		System.out.println("all even: " + list.stream().allMatch((i) -> i % 2 == 0));

		System.out.println("some even: " + list.stream().anyMatch((i) -> i % 2 == 0));

		System.out.print("plus 1: ");
		list.stream().map((i) -> i + 1).forEach(Lab9::print);
		System.out.println();
 
		System.out.print("times 3: ");
		list.stream().map((i) -> i * 3).forEach(Lab9::print);
		System.out.println();

		System.out.println("sum: " + list.stream().reduce(0, (x,y) -> x + y));
 		
		System.out.println("distinct sum: " + list.stream().distinct().reduce(0, (x,y) -> x + y));
 		
		System.out.println("sum of even: " + list.stream().filter((i) -> i % 2 == 0).reduce(0, (x,y) -> x + y));
 		
		System.out.println("sum of largest 5: " + list.stream()
			.sorted(Integer::compare).skip(15).reduce(0, (x,y) -> x + y));
		
		System.out.print("fibonacci: ");
		Stream.iterate(0, i -> i + 1).limit(20)
			.map((e) -> {
                        	if (e == 0) {
                        	        return 0;
                        	}
                        	else if (e == 1) {
                        	        return 1;
                        	}

                        	int prev = 0;
                        	int cur = 1;
                        	for(int i = 2; i < e; i++) {
                        	        int next = prev + cur;
                        	        prev = cur;
                        	        cur = next;
                        	}
                        	return prev + cur;

                	})
			.forEach(Lab9::print);
		System.out.println();

		System.out.print("fibonacci: ");
		Stream.iterate(new int[]{0,1}, arr -> new int[]{arr[1],arr[0]+arr[1]})
			.limit(20)
			.map(arr -> arr[0])
			.forEach(Lab9::print);
		System.out.println();

	}

	public static void print(Integer i) {
		System.out.print(i + " ");
	}

}
