当前位置: 代码网 > it编程>编程语言>Java > Java Stream流详解

Java Stream流详解

2024年08月02日 Java 我要评论
Java Stream流是一种非常强大和灵活的数据处理工具,可以帮助开发人员轻松处理和转换数据。Stream流支持丰富多样的操作方法,如filter()、map()、reduce()等,能够简化代码,提高效率和可读性。在多线程场景下,Stream流更是发挥了现代多核处理器的优势,可以获得更好的性能表现。本文从基础入门到进阶特点为读者介绍Java Stream流的相关知识。

学习目标

stream api主要提供了两种类型的操作:中间操作 和 终止操作。

中间操作

filter(过滤)

  • filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。

建一个数组,帅选出长度大于4的元素


eg:
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        list<string> collect = names.stream().filter(item -> item.length() > 4).collect(collectors.tolist());
        system.out.println(collect);
    }
}

在这里插入图片描述

map(转换)

  • map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素到另一个元素。
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        list<integer> collect = numbers.stream().map(n ->
        {
            n = n * 2;
            return n;
        }).collect(collectors.tolist());
        for (integer integer : collect) {
            system.out.println("integer = " + integer);
        }
    }
}

首先创建了一个包含数字 1~5 的列表。
然后利用 stream() 方法将列表转换成 stream 对象。
接下来调用 map() 方法对每个元素进行操作,这里使用了 lambda 表达式对每个元素进行了乘以 2 的操作。
最后调用 collect() 方法将结果收集起来,并转换成 list。

  • 转换为map
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        map<byte, integer> collect = numbers.stream().collect(collectors.tomap(integer::bytevalue, item -> item*2, (val1, val2) -> val2));
        for (map.entry<byte, integer> byteintegerentry : collect.entryset()) {
            byte key = byteintegerentry.getkey();
            system.out.println("key = " + key);
            system.out.println("value = " + byteintegerentry.getvalue());
        }
    }
}

在这里插入图片描述

sorted(排序)

  • sorted()方法可对流进行排序。它可以接受一个comparator参数,也可以使用自然排序ordering.natural()。默认排序是按升序排序。
public class main {
    public static void main(string[] args) {
        int[] numbers = { 5, 2, 8, 3, 7 };
        int[] sortednumbers = arrays.stream(numbers).sorted().toarray();
        system.out.println(arrays.tostring(sortednumbers));
    }
}

在这里插入图片描述

distinct(去重)

  • distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 2, 1);
        list<integer> collect = numbers.stream().distinct().collect(collectors.tolist());
        system.out.println(collect);
    }
}

java

limit(限制)

  • limit()方法可以将流限制为指定的元素数。
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        list<integer> collect = numbers.stream().limit(3).collect(collectors.tolist());
        system.out.println(collect);
    }
}

在这里插入图片描述

skip(跳过)

public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        list<integer> collect = numbers.stream().skip(2).collect(collectors.tolist());
        system.out.println(collect);
    }
}
  • skip()方法可跳过前n个元素。

在这里插入图片描述

peek(展示)

  • peek()方法可以用于在stream流中获取元素同时执行一些操作,如打印、调试、观察等。通常会与其他的方法联合使用。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        list<string> filterednames = names.stream()
                .peek(system.out::println)
                .filter(name -> name.startswith("c"))
                .peek(name -> system.out.println("filtered value: " + name))
                .collect(collectors.tolist());
        system.out.println("-----------------------------------------------------------------");
        system.out.println(filterednames);
    }
}

在这里插入图片描述

终止操作

foreach(循环)

  • foreach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        names.stream().foreach(system.out::println);
    }
}

在这里插入图片描述

collect(收集)

  • collect()方法可以将流中的元素收集到一个集合中。一般与其他方法配合使用。
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        list<integer> evennumbers = numbers.stream().filter(n -> n % 2 == 0).collect(collectors.tolist());
        system.out.println(evennumbers);
    }
}

在这里插入图片描述

count(计数)

  • count()方法可以返回流中的元素数。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        long count = names.stream().count();
        system.out.println(count);
    }
}

在这里插入图片描述

reduce(聚合)

  • reduce()方法可以将流元素聚合为单个结果。它接受一个binaryoperator参数作为累加器。
public class main {
    public static void main(string[] args) {
        list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5);
        optional<integer> sum = numbers.stream().reduce((a, b) -> a + b);
        system.out.println(sum);
    }
}

在这里插入图片描述

anymatch(任意匹配)

  • anymatch()方法如果至少有一个元素与给定的谓词匹配,则返回true。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        boolean anystartswithb = names.stream().anymatch(name -> name.startswith("b"));
        system.out.println(anystartswithb);
    }
}

在这里插入图片描述

allmatch(全部匹配)

  • allmatch()方法如果所有元素都与给定谓词匹配,则返回true。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        boolean allstartswithb = names.stream().allmatch(name -> name.startswith("b"));
        system.out.println(allstartswithb);
    }
}

在这里插入图片描述

nonematch(无匹配)

  • nonematch()方法,如果没有任何元素与给定谓词匹配,则返回true。
public class main {
    public static void main(string[] args) {
        list<string> names = arrays.aslist("alex", "brian", "charles", "david");
        boolean nonestartswithb = names.stream().nonematch(name -> name.startswith("e"));
        system.out.println(nonestartswithb);
    }
}

在这里插入图片描述

以上就是java stream流的基础知识和操作方式。stream api可以使java程序员编写出高效,干净,紧凑的代码,使得代码易于阅读和维护。建议初学者多加练习,掌握基本操作。中级和高级程序员则需要深入研究stream api的实现原理和运作机制,进一步提高代码的质量和效率。

使用stream流的优缺点:

优点:

缺点:

怎么用?

好书分享

在这里插入图片描述

618,清华社 it book 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华
社为您精选多款高分好书,涵盖了 c++、java、python、前端、后端、数据库、算法与机器学习等多
个 it 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来查看详情

图书链接:项目驱动零起点学java

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com