public class StreamDemo3 {
    public static void main(String[] args) {
        /*
        Stream流的中间方法:

        filter 过滤
        limit 取用前几个
        skip 跳过前几个
        distinct 去重,依赖(hashCode和equals方法)
        concat 合并a流和b流为一个流 //静态方法,用Stream接口名调用
        map 类型转换
		map() 是一个中间操作方法,作用是把流中的每个元素按照指定的函数进行转换,最终返回一个包含转换后元素的新流。
         */
        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"haha","xiangxiang","baby","xixi");
        list.stream().filter(str->str.length()==4).forEach(str-> System.out.println(str));
        System.out.println("----------------");
        list.stream().skip(1).limit(1).forEach(str-> System.out.println(str));//xiangxiang
        list.stream().limit(2).skip(1).forEach(str-> System.out.println(str));//xiangxiang
        System.out.println("----------------");

        //distinct去重
        ArrayList<String> list2=new ArrayList<>();
        Collections.addAll(list2,"haha","haha","haha","xiangxiang","baby","xixi");
        list2.stream().distinct().forEach(str-> System.out.println(str));
        System.out.println("----------------");
        //concat合并
        Stream.concat(list.stream(),list2.stream()).forEach(str-> System.out.println(str));
        System.out.println("----------------");
        //map类型转换
        ArrayList<String> list3=new ArrayList<>();
        Collections.addAll(list3,"haha-18","xiangxiang-17","baby-111","xixi-666");
        //只获取其中的年龄打印出来
        //map方法中有两个类型,一个是原本的类型,一个是转换后的类型
        //apply的形参s:依次表示其中每个数据
        //apply的返回值:表示转换后的类型
        list3.stream()
                .map(s->Integer.parseInt(s.split("-")[1]))
                .forEach(str-> System.out.println(str));
    }
}
-----------------------------------------
public class StreamDemo4 {
    public static void main(String[] args) {
        /*
        stream流的终结方法:

        void forEach(Consumer action) //遍历
        long count() //统计个数
        toArray() //转换为数组
         */
        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"haha","xiangxiang","baby","xixi");
        //遍历
        list.stream().forEach(str-> System.out.println(str));
        System.out.println("----------------");
        //统计个数
        long count = list.stream().count();
        System.out.println(count);
        System.out.println("----------------");
        //转换为数组
        Object[] arr1 = list.stream().toArray();//存储到Object类型的数组中
        System.out.println(Arrays.toString(arr1));
        System.out.println("-----------------");
        //value表示数组中的元素个数
        String[] arr2 = list.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
    }
}
-----------------------------------------
public class StreamDemo5 {
    public static void main(String[] args) {
        /*
        collect( Collector collector)  收集流中的数据,放到集合中(list set map)
        收集到map集合中,键不能重复
         */

        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"haha","xiangxiang","baby","xixi");
        //收集到list集合中
        List<String> list1 = list.stream().filter(str -> str.startsWith("x")).collect(Collectors.toList());
        System.out.println(list1);
        System.out.println("----------------");
        //收集到set集合中
        Set<String> list2 = list.stream().filter(str -> str.startsWith("x")).collect(Collectors.toSet());
        System.out.println(list2);
        System.out.println("----------------");
        //收集到map集合中
        //key表示键,value表示值
        //toMap方法有三个参数,第一个参数表示键,第二个参数表示值,第三个参数表示键冲突的解决方式
        Map<String, Integer> map = list.stream().filter(str -> str.startsWith("x")).collect(Collectors.toMap(s -> s, s -> s.length()));
        System.out.println(map);
    }
}

-----------------------------------------------
public class StreamDemo1 {
    public static void main(String[] args) {
        //需求:
        //把所有张开头的放在一个新数组中
        //把张开头的名字的长度为3的放在一个新数组中
        //遍历新数组
        ArrayList<String> list=new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        ArrayList<String> listZhang =new ArrayList<>();
        for (String s : list) {
            if(s.startsWith("张")){
                listZhang.add(s);
            }
        }
        ArrayList<String> listzhang3 =new ArrayList<>();
        for (String s : listZhang) {
            if(s.length()==3){
                listzhang3.add(s);
            }
        }
        for (String s : listzhang3) {
            System.out.println(s);
        }

        //使用Stream流
        list.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name-> System.out.println(name));
    }
}
----------------------------
public class StreamDemo2 {
    public static void main(String[] args) {
        //Stream流的使用方法
        /*
        单列集合 default Stream<E> stream() collection中的默认方法
        双列集合 无 无法直接使用Stream流,要转成set集合或者list集合
        数组 public static <T> Stream<T> stream(T[] array) Arrays工具类中的静态方法
        一堆零散数据 public static <T> Stream<T> stream(T... values) stream接口中的静态方法
         */
        //1.单列集合获取Stream流
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"haha","xiangxiang","xixi","baby");
        list.stream().filter(str->str.length()==4).filter(str->str.startsWith("h")).forEach(str-> System.out.println(str));
        //2.双列集合获取Stream流
        Map<String,Integer> map = new HashMap<>();
        map.put("haha",1);
        map.put("xiangxiang",2);
        map.put("xixi",3);
        map.put("baby",4);
        //小加花(把其变成不可变的双列集合)
        Map<String, Integer> map1 = Map.copyOf(map);
        Set<Map.Entry<String, Integer>> entries = map1.entrySet();
        entries.stream().filter(entry->entry.getKey().length()==4).filter(entry->entry.getValue()==1).forEach(entry-> System.out.println(entry));
        System.out.println("----------------");
        //3.数组获取Stream流
        String[] arr={"haha","xiangxiang","xixi","baby"};
        Arrays.stream(arr).forEach(str-> System.out.println(str));
        System.out.println("----------------");
        //4.一堆零散数据获取Stream流
        //可以传递零散数据,也可以传递数组
        //但是数组必须是引用数据类型的数据
        int[] arr2={1,2,3};
        Stream.of("haha","xiangxiang","xixi","baby").forEach(str-> System.out.println(str));
        Stream.of(arr2).forEach(s-> System.out.println(s));//[I@312b1dae
    }
}