JAVA8 Stream

1 Steam流式思想概述

Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象!
Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工
处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。

在这里插入图片描述

Stream API能让我们快速完成许多复杂的操作,如筛选、切片、映射、查找、去除重复,统计,匹配和归约。

2 Stream流的获取方式

首先,java.util.Collection 接口中加入了default方法 stream,也就是说Collection接口下的所有的实现都可以通过steam方法来获取Stream流。

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.stream();
        Set<String> set = new HashSet<>();
        set.stream();
        Vector vector = new Vector();
        vector.stream();
 }

但是Map接口别没有实现Collection接口,那这时怎么办呢?这时我们可以根据Map获取对应的key value的集合。

public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        Stream<String> stream = map.keySet().stream(); // key
        Stream<Object> stream1 = map.values().stream(); // value
        Stream<Map.Entry<String, Object>> stream2 = map.entrySet().stream(); // entry
}

3 Stream常用方法介绍

Stream常用方法
Stream流模型的操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种:

方法名方法作用返回值类型方法种类
count统计个数long终结
forEach逐一处理void终结
filter过滤Stream函数拼接
limit取用前几个Stream函数拼接
skip跳过前几个Stream函数拼接
map映射Stream函数拼接
concat组合Stream函数拼接

终结方法:返回值类型不再是 Stream 类型的方法,不再支持链式调用。本小节中,终结方法包括 count 和 forEach 方法。

非终结方法:返回值类型仍然是 Stream 类型的方法,支持链式调用。除了终结方法外,其余方法均为非终结方法。

Stream注意事项(重要)

  1. Stream只能操作一次
  2. Stream方法返回的是新的流
  3. Stream不调用终结方法,中间的操作不会执行

3.1 forEach

遍历:

public static void main(String[] args) {
        List<String> words = Arrays.asList("Hello", "World");
        words.stream().forEach(System.out::println);
}

3.2 count

Stream流中的count方法用来统计其中的元素个数的:

public static void main(String[] args) {
        List<String> words = Arrays.asList("Hello", "World");
        //for each , count
        System.out.println(words.stream().count());
    }

3.3 filter

在这里插入图片描述

filter方法的作用是用来过滤数据的。返回符合条件的数据:

public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "window", "good", "nice");
        //for each , count
        words.stream().filter(o->o.startsWith("w")).forEach(System.out::println);
    }

在这里插入图片描述

3.4 map

如果我们需要将流中的元素映射到另一个流中,可以使用map方法:

在这里插入图片描述

public static void main(String[] args) {
        List<String> words = Arrays.asList("hello", "world", "window", "good", "nice");
        //for each , count
        words.stream().map(String::length).forEach(System.out::println);

    }

在这里插入图片描述

3.5 sorted

如果需要将数据排序,可以使用sorted方法:

public static void main(String[] args) {
        List<String> words = Arrays.asList("1", "22", "33", "20", "30");
        //for each , count
        words.stream().map(Integer::parseInt).sorted((n1, n2) -> n2 - n1).forEach(System.out::println);

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ujsDWZEh-1684739478779)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1de44612-5ecf-445a-9365-7bcb0da5aed4/Untitled.png)]

3.6 distinct

如果要去掉重复数据,可以使用distinct方法:

在这里插入图片描述

public static void main(String[] args) {
        List<String> words = Arrays.asList("1", "22", "22", "19", "33", "20", "30");
        //for each , count
        words.stream()
                .distinct()
                .map(Integer::parseInt)
                .sorted((n1, n2) -> n2 - n1)
                .forEach(System.out::println);

    }

在这里插入图片描述

3.7 Max Min

在这里插入图片描述

public static void main(String[] args) {
        List<String> words = Arrays.asList("1", "22", "22", "19", "33", "20", "30");
        //for each , count
        Optional<Integer> max = words.stream().map(Integer::parseInt)
                .max((o1, o2) -> o1 - o2);
        System.out.println(max.get());

        Optional<Integer> min = words.stream().map(Integer::parseInt)
                .min((o1, o2) -> o1 - o2);
        System.out.println(min.get());

    }
public static void main(String[] args) {

        List<Person> peoples = Arrays.asList(
                new Person("r1", 12, 180),
                new Person("r2", 13, 180),
                new Person("r3", 14, 180)
        );

        Optional<Person> max = peoples.stream().max((o1, o2) -> o1.getAge() - o2.getAge());
        System.out.println(max.get());

    }

3.8 reduce

在这里插入图片描述

如果需要将所有数据归纳得到一个数据,可以使用reduce方法:

public static void main(String[] args) {

        List<Person> peoples = Arrays.asList(
                new Person("r1", 12, 180),
                new Person("r2", 13, 180),
                new Person("r3", 14, 180)
        );
        // 所有年龄
        Integer reduce = peoples.stream().map(Person::getAge).reduce(0, Integer::sum);
        System.out.println(reduce);

        // 最大值
        Integer maxAge = peoples.stream().map(Person::getAge).reduce(0, Integer::max);
        System.out.println(maxAge);

    }

在这里插入图片描述

4 Stream结果收集

4.1 流中数据收集

public static void main(String[] args) {

        List<String> list = Stream.of("aa", "bb", "cc", "aa")
                .collect(Collectors.toList());
        System.out.println(list);
        // 收集到 Set集合中
        Set<String> set = Stream.of("aa", "bb", "cc", "aa")
                .collect(Collectors.toSet());
        System.out.println(set);
    }

在这里插入图片描述

4.2 流中数据聚合计算

public static void main(String[] args) {

        // 获取年龄的最大值
        Optional<Person> maxAge = Stream.of(
                new Person("张三", 18)
                , new Person("李四", 22)
                , new Person("张三", 13)
                , new Person("王五", 15)
                , new Person("张三", 19)
        ).collect(Collectors.maxBy((p1, p2) -> p1.getAge() - p2.getAge()));
        System.out.println("最大年龄:" + maxAge.get());
        // 获取年龄的最小值
        Optional<Person> minAge = Stream.of(
                new Person("张三", 18)
                , new Person("李四", 22)
                , new Person("张三", 13)
                , new Person("王五", 15)
                , new Person("张三", 19)
        ).collect(Collectors.minBy((p1, p2) -> p1.getAge() - p2.getAge()));
        System.out.println("最新年龄:" + minAge.get());
        // 求所有人的年龄之和
        Integer sumAge = Stream.of(
                        new Person("张三", 18)
                        , new Person("李四", 22)
                        , new Person("张三", 13)
                        , new Person("王五", 15)
                        , new Person("张三", 19)
                )
                //.collect(Collectors.summingInt(s -> s.getAge()))
                .collect(Collectors.summingInt(Person::getAge))
                ;
        System.out.println("年龄总和:" + sumAge);
        // 年龄的平均值
        Double avgAge = Stream.of(
                new Person("张三", 18)
                , new Person("李四", 22)
                , new Person("张三", 13)
                , new Person("王五", 15)
                , new Person("张三", 19)
        ).collect(Collectors.averagingInt(Person::getAge));
        System.out.println("年龄的平均值:" + avgAge);
        // 统计数量
        Long count = Stream.of(
                        new Person("张三", 18)
                        , new Person("李四", 22)
                        , new Person("张三", 13)
                        , new Person("王五", 15)
                        , new Person("张三", 19)
                ).filter(p->p.getAge() > 18)
                .collect(Collectors.counting());
        System.out.println("满足条件的记录数:" + count);
    }

在这里插入图片描述

4.3 对流中数据做分组操作

当我们使用Stream流处理数据后,可以根据某个属性将数据分组

public static void main(String[] args) {

        List<Person> peoples = Arrays.asList(
                new Person("r1", 12),
                new Person("r2", 13),
                new Person("r3", 14)
        );

        Map<Integer, List<Person>> collect = peoples.stream().collect(Collectors.groupingBy(Person::getAge));

        System.out.println(collect);


    }

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Java 8引入了Stream API,它是一种处理集合数据的新方式。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方式,不需要显式地编写循环,使得代码更加简洁。 3. 函数式编程:Stream API支持函数式编程风格,可以通过Lambda表达式来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的中间操作和终止操作来对集合进行处理。中间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合中。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

响彻天堂丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值