Stream流

流:就像流水线一样

先得到一条Stream流,并把数据放上去

利用Api进行各种操作

分为中间方法和终结方法

单列集合

        //1.单列集合获取Stream流
        ArrayList list = new ArrayList<>();
        Collections.addAll(list, "a", "b", "v");

        //获取到一条流水线,并把集合中的数据放到流水线上
/*        Stream stream1 = list.stream();
        //使用终结方法打印所有数据
*//*        stream1.forEach(new Consumer() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });*//*
         */
        list.stream().forEach(s -> System.out.println(s));
        

双列集合

//双列集合,不能直接使用stream

//1.创建双列集合
HashMap hm = new HashMap<>();
hm.put("a", 1);
hm.put("b", 2);
hm.put("c", 3);
hm.put("d", 4);
hm.put("e", 5);

//2.第一zhong获取stream
hm.keySet().stream().forEach(s -> System.out.println(s));

//3.第二种获取
hm.entrySet().stream().forEach(s -> System.out.println(s));

数组

//数组
//1.创建数组
int[] arr = {1, 2, 3, 4, 5};

//2.获取stream流
Arrays.stream(arr).forEach(s -> System.out.println(s));

零散数据

//一堆零三数据

Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));

中间方法

中间方法,返回新的stream流,原来的stream只能使用一次,建议使用链式编程

修改stream流中的数据,不会影响本身的

过滤

ArrayList list=new ArrayList<>();
Collections.addAll(list,"aaa,","aaaa","bbb","aab");

//filter过滤
list.stream().filter(new Predicate() {
    @Override
    public boolean test(String s) {
        //如果返回值为true,留下
        s.startsWith("a");
        return s.startsWith("a");
    }
}).forEach(s-> System.out.println(s));

//链式编程

list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s ));

获取,跳过

/*
 * limit 获取前几个元素
 * skip  跳过前几个元素
 *
 * */

list.stream().limit(3)
        .forEach(s -> System.out.println(s));

list.stream().skip(4)
        .forEach(s -> System.out.println(s));

去重 合并

/*
 *
 * distinct  元素去重,依赖于哈市Code和equals方法
 *
 * concat       合并a,b为一个流
 *

 * */

ArrayList list1=new ArrayList<>();
Collections.addAll(list1,"aaaa","ab","aaaaaa","bbbbbb","ccccccccc","abccc","aaaa","ab");

ArrayList list2=new ArrayList<>();
Collections.addAll(list2,"bbbb","cccc");

list1.stream().distinct().forEach(s-> System.out.println(s));

Stream.concat(list1.stream(),list2.stream()).forEach(s-> System.out.println(s));

类型转换

/*
 * map   转换流中的数据类型
 * */

ArrayList list = new ArrayList<>();
Collections.addAll(list, "lbx-18", "zjy-18");

//只获取里面的年龄并打印
//String->int

//方法内部的s表示流里的每一个数据
//return 表示转换以后的数据

list.stream().map(new Function() {
    @Override
    public Integer apply(String s) {
        String[] split = s.split("-");
        return Integer.parseInt(split[1]);
    }
}).forEach(s-> System.out.println(s));
System.out.println("=======================");
list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));

终结方法

遍历

/*
 * 泛型:流中数据的类型
 * 形参s 以此表示流的每一个数据
 *
 *
 * */
list1.stream().forEach(new Consumer() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});


list1.stream().forEach(s -> System.out.println(s));

统计

//统计
long count = list1.stream().count();
System.out.println(count);

收集

收集到数组

        /*
        * 泛型:是一个具体类型的数组
        * apply中的形参:流中数据的个数,要跟数组的长度保持一致
        * 返回值:具体类型的数组
        * */

        //toArray方法的参数的作用:创建一个指定类型的数组
        //底层:会依次得到流李的每一个元素,并把数据存到数组当中
        //toArray方法的返回值:是一个装着流里面所有数据的数组
/*        String[] arr= list1.stream().toArray(new IntFunction() {
            @Override
            public String[] apply(int value) {
                return new String[value];
            }
        });
        System.out.println(Arrays.toString(arr));*/

        String[] arr2 = list1.stream().toArray(value -> new String[value]);
        System.out.println(Arrays.toString(arr2));
    }

收集到集合

//收集到map
//收集所有男性
//确认键为姓名,值为年龄

Map newMap = list.stream()
        .filter(s -> "男".equals(s.split("-")[1]))
        /*
         * toMap:两个参数
         * 参数1:键的生成规则
         * 参数2:值的生成规则
         * 参数一:
         *       Function泛型一:表示流中每一个数据的类型
         *               泛型二:表示Map集合中键的数据类型
         *       方法apply形参:表示流李每一个数据
         *               方法体:生成键的代码
         *
         *
         * 参数二:
         *      Function泛型一:表示流中每一个数据的类型
         *               泛型二:表示Map集合中值的数据类型
         *                   方法apply形参:生成值的代码
         *               方法体:已经生成的值
         *
         * 注意点:键不能重复!!
         * */
        .collect(Collectors.toMap(new Function() {
            @Override
            public String apply(String s) {
                return s.split("-")[0];
            }
        }, new Function() {
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s.split("-")[2]);
            }
        }));
System.out.println(newMap);
Map Map = list.stream()
        .filter(s -> "男".equals(s.split("-")[1]))
        .collect(Collectors.toMap(
                s -> s.split("-")[0],
                s -> Integer.parseInt(s.split("-")[2])
        ));
System.out.println(Map);

你可能感兴趣的:(windows)