Stream流 学习笔记

发布于:2024-10-15 ⋅ 阅读:(89) ⋅ 点赞:(0)

为了提高程序员对数组和集合的操作便利性而推出的操作--Stream流

1.流的创建

数组用Arrays.stream(数组名)来获取流

集合用集合.stream()来获取流

String [] strings;
List list =new ArrarList<>();
//数组
stream =Arrays.stream(strings)
//集合
stream =list.stream();

2.操作流

1)过滤

调用filter可以过滤出流中符合条件的元素,filter方法参数可以支持一个Lambda表达式

 List<String> list =new ArrayList<>();
        list.add("宁舒意");
        list.add("周杰伦");
        list.add("薛之谦");

        //过滤出包含”宁“的元素
        Stream<String> stream =list.stream().filter(e->e.contains("宁"));
        stream.forEach(System.out::println);

stream.forEach(System.out::println);

这行代码解读一下,forEach就是遍历流的所有元素,类名::方法就相当于调用类中的方法。

这行代码就是对于流中的每个元素都调用一次啊这个输出方法,元素就是输出的参数

2)映射

map()方法就是将流中所有元素按照map方法参数中的规则转换成新的流中的元素。

 /**
     * 映射,将流中每个元素都按照map()括号里面的规则进行转换,但是原来的流不变,只是创建新流
    **/
    private static void f3(){
        List<String> list =new ArrayList<>();
        list.add("宁舒意");
        list.add("周杰伦");
        list.add("薛之谦");
        //这里map里面的参数表示调用String的legth方法,即返回每个字符串的长度
        Stream<Integer> stream =list.stream().map(String::length);
        stream.forEach(System.out::println);
    }

3)匹配

匹配,判断该流是否符合条件

stream.anyMatch()有一个元素匹配,就返回true

stream.allMatch()全部匹配,才返回true

stream.noneMatch()全部不匹配,才返回true

/**
     * 匹配
    **/
    private static void f4(){
        List<String> list =new ArrayList<>();
        list.add("宁舒意");
        list.add("周杰伦");
        list.add("薛之谦");

        //只要有一个元素匹配条件,就返回true
        boolean anyMatch =list.stream().anyMatch(e->e.contains("宁"));
        //必须全部匹配,才返回true
        boolean allMatch =list.stream().allMatch(e->e.contains("宁"));
        //全部不匹配,才返回true
        boolean noneMatch =list.stream().noneMatch(e->e.contains("宁"));
    }

4)组合

组合就是调用reduce()方法将流中的元素按照reduce()方法参数定义的Lambda规则都组合起来,比如:将六种所有元素都加起来。

reduce((a,b)-> a+b)

也可以设置一个起始值放在第一个参数:reduce(6,(a,b)-> a+b) ,这会将流中所有元素都加起来再加6。

/**
     * 组合
    **/
    private static void f5(){
        Integer[] ints ={0,1,2,3};
        List<Integer> list =Arrays.asList(ints);

        //reduce方法的参数可以接受一个lambda表达式
        Optional<Integer> optional1 =list.stream().reduce((a,b)->a+b);
        Optional<Integer> optional2 =list.stream().reduce(Integer::sum);
        System.out.println(optional1.orElse(0));
        System.out.println(optional2.orElse(0));

        int reduce =list.stream().reduce(6,(a,b)->a+b);
        System.out.println(reduce);
        int reduce1 =list.stream().reduce(6,Integer::sum);
        System.out.println(reduce1);

    }

5)转换流

可以把流转换回数组或者集合,collect()

stream.toArray,可以将流转换成数组


 private static void f6(){
        List<String> list =new ArrayList<>();
        list.add("宁舒意");
        list.add("周杰伦");
        list.add("薛之谦");

        //将集合转换成stream流,再调用toArray方法转换成数组
        String[] strings =list.stream().toArray(String[]::new);

        List<Integer> list1 =list.stream().map(String::length).collect(Collectors.toList());

        List<String> list2 =list.stream().collect(Collectors.toCollection(ArrayList::new));

        System.out.println(list1);
        System.out.println(list2);


        String str =list.stream().collect(Collectors.joining(",")).toString();
        System.out.println(str);
    }

网站公告

今日签到

点亮在社区的每一天
去签到