Java_26_Stream流

Stream

  1. 什么是Stream流?
    在Java 8中,得益于Lambda所带来的函数式编程,
    引入了一个全新的Stream流概念 ,用于解决已有集合/数组类库有的弊端。

  2. Stream流能解决什么问题?
    可以解决已有集合类库或者数组API的弊端。
    Stream认为集合和数组操作的API很不好用,所以采用了Stream流简化集合和数组的操作!!

  3. 小结:
    Stream流是用来简化集合类库或者数组API的弊端。
    Stream流其实就一根传送带,元素在上面可以被Stream流操作。

需求:从集合中筛选出所有姓张的人出来。然后再找出姓名长度是3的人。

传统写法

public class StreamDemo01 {
    public static void main(String[] args) {
        
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        //1.找姓张的人
        List<String> Z_list = new ArrayList<>();
        for (String s : list) {
            if(s.startsWith("张")){
                Z_list.add(s);
            }
        }
        System.out.println(Z_list);
        //2.姓名长度为3
        List<String> Z_Long_list = new ArrayList<>();
        for (String s : Z_list) {
            if(s.length() == 3) Z_Long_list.add(s);
        }
        System.out.println(Z_Long_list);
    }
}

Stream流写法

public class StreamDemo01 {
    public static void main(String[] args) {
        //需求:从集合中筛选出所有姓张的人出来。然后再找出姓名长度是3的人。
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

        list.stream().filter(s -> s.startsWith("张"))
			         .filter(s -> s.length() == 3)
			         .forEach(System.out::println);
    }
}

如上见得:stream基于函数式编程,更加简单!
他的限制流filter可以链式编程,最后遍历!

Stream流的获取

  1. Stream流式思想的核心:
    先得到集合或者数组的Stream流(就是一根传送带)然后就用这个Stream流操作集合或者数组的元素。然后用Stream流简化替代集合操作的API.

  2. 集合获取流的API:
    (1) default Stream stream();

  3. 小结:
    集合获取Stream流用: stream();
    数组:Arrays.stream(数组) / Stream.of(数组);

public class StreamDemo01 {
    public static void main(String[] args) {
        /** --------------------Collection集合获取流-------------------------------   */
        // Collection集合如何获取Stream流。
        Collection<String> c = new ArrayList<>();
        Stream<String> ss = c.stream();

        /** --------------------Map集合获取流-------------------------------   */
        Map<String, Integer> map = new HashMap<>();
        // 先获取键的Stream流。
        Stream<String> keyss = map.keySet().stream();
        // 在获取值的Stream流
        Stream<Integer> valuess = map.values().stream();
        // 获取键值对的Stream流(key=value: Map.Entry<String,Integer>)
        Stream<Map.Entry<String,Integer>> keyAndValues = map.entrySet().stream();

        /** ---------------------数组获取流------------------------------   */
        // 数组也有Stream流。
        String[] arrs = new String[]{"Java", "JavaEE" ,"Spring Boot"};
        Stream<String> arrsSS1 = Arrays.stream(arrs);
        Stream<String> arrsSS2 = Stream.of(arrs);

    }
}

Stream的常用API

forEach : 逐一处理(遍历)
count:统计个数
– long count();
filter : 过滤元素
– Stream filter(Predicate<? super T> predicate)
limit : 取前几个元素
skip : 跳过前几个
map : 加工方法
concat : 合并流。

public class StreamDemo03 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");
        //遍历foreach
        list.stream().filter(s -> s.length() == 3)
                .filter(s -> s.startsWith("张"))
                .forEach(System.out::println);
        //统计个数count
        long count = list.stream().filter(s -> s.length() == 3)
                .filter(s -> s.startsWith("张")).count();
        System.out.println(count);
        //取前几个
        list.stream().filter(s -> s.length() == 3)
                .limit(2)
                .forEach(System.out::println);
        //跳过前几个
        list.stream().filter(s -> s.length() == 3)
                .skip(2)
                .forEach(System.out::println);
        //map方法(映射):加工方法 将原元素加工后放上去
        /*将所有名称都加上小小的……*/
        list.stream().map(s -> "小小的" + s).forEach(System.out::println);
        /*将名称都加工成学生对象*/
        //list.stream().map(s -> new Student(s)).forEach(System.out::println);
        list.stream().map(Student::new).forEach(System.out::println);//构造器引用
         /**
         * concat合并流
         */
        //数组流
        Stream<Integer> s1 = Stream.of(10,20,30,40);
        //集合流
        Stream<String> s2 = list.stream();
        //合并流 类型不同可用Object接 只能两两合并!!!!
        Stream<Object> allStream = Stream.concat(s1,s2);
        allStream.forEach(System.out::println);
    }
}

综合案例

public class StreamDemo04 {
    public static void main(String[] args) {
        List<String> one = new ArrayList<>();
        one.add("迪丽热巴");
        one.add("宋远桥");
        one.add("苏星河");
        one.add("老子");
        one.add("庄子");
        one.add("孙子");
        one.add("洪七公");

        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖");
        two.add("张二狗");
        two.add("张天爱");
        two.add("张三");
        /**
         * 1. 第一个队伍只要名字为3个字的成员姓名;
         * 2. 第一个队伍筛选之后只要前3个人;
         */
        Stream<String> oneStream = one.stream()
                .filter(s -> s.length() == 3).limit(3);
        /**
         * 3. 第二个队伍只要姓张的成员姓名;
         * 4. 第二个队伍筛选之后不要前2个人;
         * 5. 将两个队伍合并为一个队伍;
         */
        Stream<String> twoStream =  two.stream()
                .filter(s -> s.startsWith("张")).skip(2);
        Stream<String> allStream = Stream.concat(oneStream,twoStream);
        /**
         * 6. 根据姓名创建`Student`对象; (加工)
         * 7. 打印整个队伍的Student对象信息。
         */
        allStream.map(Student::new).forEach(System.out::println);
    }
}

Stream终结与非终结方法

  1. 终结方法:一旦Stream调用了终结方法,流的操作就全部终结了,不能继续使用,
    只能创建新的Stream操作。
    终结方法: foreach , count。

  2. 非终结方法:每次调用完成以后返回一个新的流对象,
    可以继续使用,支持链式编程!

public class StreamDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");

        // foreach终结方法
        list.stream().filter(s -> s.startsWith("张"))
                .filter(s -> s.length() == 3).forEach(System.out::println);

        long count =  list.stream().filter(s -> s.startsWith("张"))
                .filter(s -> s.length() == 3).count();
        System.out.println(count);


    }
}

收集Stream流

  1. 引入:

    1. Stream的作用是:把集合转换成一根传送带,借用Stream流的强大功能进行的操作。但是实际开发中数据最终的形式还是应该是集合,最终Stream流操作完毕以后还是要转换成集合。这就是收集Stream流。
  2. 收集Stream流的含义:就是把Stream流的数据转回到集合中去。

  3. Stream流:手段。
    集合:才是目的。

  4. 小结:
    收集Stream流的含义:就是把Stream流的数据转回到集合中去。

    熟练函数式编程,如Lambda表达式简化函数式接口的匿名内部类形式,以及四种方法引用简化Lambda表达式,以及流式编程思想如Stream简化集合或者数组的操作。

public class StreamDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");

        Stream<String> zhangLists = list.stream().filter(s -> s.startsWith("张"));
        // 把stream流转换成Set集合。
        Set<String> sets = zhangLists.collect(Collectors.toSet());
        System.out.println(sets);

        // 把stream流转换成List集合。
        Stream<String> zhangLists1 = list.stream().filter(s -> s.startsWith("张"));
        List<String> lists= zhangLists1.collect(Collectors.toList());
        System.out.println(lists);

        // 把stream流转换成数组。
        Stream<String> zhangLists2 = list.stream().filter(s -> s.startsWith("张"));
        Object[] arrs = zhangLists2.toArray();
        // 可以借用构造器引用申明转换成的数组类型!!!
        String[] arrs1 = zhangLists2.toArray(String[]::new);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java 8的(stream)操作是一种新的API,提供了一种简单而有效的方法来处理集合和数组等数据类型。操作可以让我们以一种更加声明式的方式来处理数据,从而提高代码的可读性和可维护性。 Java 8中的操作具有以下特点: 1. 集成了过滤、映射、排序、聚合等操作; 2. 支持并行处理,提高了运行效率; 3. 可以避免空指针异常等常见问题; 4. 支持延迟计算,节省了资源。 下面是使用Java 8的操作的一些示例: 1. 过滤操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); ``` 上面的代码使用了stream()方法将List转换成,使用filter()方法过滤出偶数,最后使用collect()方法将结果转换成List。 2. 映射操作: ``` List<String> words = Arrays.asList("hello", "world"); List<Integer> result = words.stream() .map(String::length) .collect(Collectors.toList()); ``` 上面的代码使用了map()方法将List中的字符串转换成它们的长度,最后使用collect()方法将结果转换成List。 3. 排序操作: ``` List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2); List<Integer> result = numbers.stream() .sorted() .collect(Collectors.toList()); ``` 上面的代码使用了sorted()方法将List中的数字按升序排序,最后使用collect()方法将结果转换成List。 4. 聚合操作: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> result = numbers.stream() .reduce((a, b) -> a + b); ``` 上面的代码使用了reduce()方法将List中的数字相加,最后返回一个Optional对象,其值为15。 在实际开发中,Java 8的操作可以大大简化代码,提高开发效率。但是需要注意的是,在处理大量数据时,操作可能会对性能产生影响,因此需要根据实际情况选择合适的方法。 ### 回答2: Java 8引入了(stream)操作,它是一种用于处理集合数据的新方式。 操作主要通过对集合进行一系列的处理操作来实现数据的筛选、转换、聚合等功能。与传统的集合操作相比,操作具有更加简洁、灵活和高效的特点。下面是一些常用的操作: 1. 过滤(filter):根据指定条件从中筛选出符合条件的元素。 2. 映射(map):通过对中的每个元素应用指定的函数来生成一个新的,可以对元素进行转换或提取。 3. 排序(sorted):对中的元素进行排序,可以根据自然顺序或自定义的排序规则进行排序。 4. 限制(limit):截断,获取指定数量的元素。 5. 跳过(skip):跳过指定数量的元素。 6. 匹配(matching):用于检查中的元素是否满足指定的条件。 7. 查找(finding):在中查找符合指定条件的元素。 8. 聚合(reducing):将中的元素使用指定的操作进行聚合,可以得到最大值、最小值、求和等结果。 9. 收集(collecting):将中的元素收集到一个集合中,可以使用预定义的收集器或自定义的收集器。 使用操作可以大大简化代码,并且使得操作更为直观和易于理解。它提供了丰富的功能,可以处理各种不同类型的集合数据。同时,操作的使用还可以减少中间变量的使用,提高代码的性能。 综上所述,Java 8的操作是一种强大的工具,可以帮助我们对集合数据进行高效的处理,提升代码的简洁性和可读性。它是现代化Java编程中不可或缺的一部分。 ### 回答3: Java 8 引入了(stream)操作,它是一种新的处理数据集合的方式。操作可以让我们以更简洁、清晰和灵活的方式处理数据。 首先,是一组有序的元素,它可以来自各种数据源,比如数组、集合或者I/O通道。操作分为两种类型:中间操作和终端操作。中间操作可以对进行转换或者过滤,但并不产生最终结果。而终端操作会触发的处理,并产生一个结果或副作用。 通过操作,我们可以进行各种常见的数据处理操作。例如,我们可以使用 filter 方法来过滤中的元素,只保留符合条件的元素。可以使用 map 方法来对中的元素进行映射,生成一个新的。可以使用 reduce 方法将中的所有元素聚合起来并生成一个结果。 此外,操作还支持并行处理。通过将转换为并行,我们可以同时对多个元素进行处理,提高处理效率。但是需要注意的是,并不是所有的操作都适合并行处理,有些操作在并行处理时可能会导致结果不确定或出错。 总之,Java 8 的操作可以让我们以更简洁、灵活的方式处理数据集合。它提供了丰富的中间操作和终端操作,支持串行和并行处理。通过学习和掌握操作,我们可以更高效地处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐鑫本鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值