package stream;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;

public class StreamExample02 {
    public static void main(String[] args) {
        Stream<Object> stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 去重操作
        stream.distinct().forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 过滤器，满足值为2的筛选
        stream.filter(x -> x.equals(2)).forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 选择序列个数为3
        stream.limit(3).forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 映射，可以修改原本的类型
        stream.map(Object::toString).forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 跳过前两个数
        stream.skip(2).forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 不会使元素数据、类型产生改变
        stream.peek(x -> ThreadLocalRandom.current().nextInt(100)).limit(10).forEach(System.out::println);

        stream = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }}.stream();

        // 从小到大排序
        stream.sorted().forEach(System.out::println);

        // 提供重载方法
        // stream.sorted(Comparator.comparing(Object::toString)).forEach(System.out::println);

        ArrayList<Integer> list = new ArrayList<>() {{
            add(1);
            add(2);
            add(2);
            add(3);
            add(3);
            add(4);
        }};
        List<ArrayList<Integer>> arrayListList = List.of(list);

        // 扁平化数组
        arrayListList.stream().flatMap(Collection::stream).forEach(System.out::println);
    }
}