Java中Stream流详解

这篇具有很好参考价值的文章主要介绍了Java中Stream流详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天在Java学习中,遇到了starm这个操作方式,了解后发现很多操作都很实用并且在项目开发中经常用到,特写下此篇博客用来记录。

一、Stream基础概念

Stream是Java 8中引入的全新API,可以极大地方便我们对集合、数组等数据源进行连续操作。它可以简化我们的代码,使代码更加易于维护和理解。Stream实际上是一种惰性计算的方式,只有需要输出结果时,才会开始计算。

Stream操作中的惰性计算

Stream只是对于原有数据的操作方式,数据本身并没有改变。因此,在对Stream进行操作时,实际上是将操作指令存储在操作流中并未计算执行,直到需要输出结果时才会被触发。这种方式可以减少计算量和开销,提高效率。

创建Stream

可以从很多种数据源中创建Stream,例如List、Set或者任何其他实现了Iterable接口的类。创建方式很简单,使用stream()parallelStream()方法即可。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); // 串行Stream
Stream<String> parallelStream = list.parallelStream(); // 并行Stream

二、常用的Stream操作方法

常用的Stream操作包括:过滤、映射、排序、去重、计数、归约等等。

filter

过滤方法filter用于对Stream中的元素进行筛选,只保留符合指定条件的元素。其函数式接口为Predicate<T>,其方法为boolean test(T t),接受一个T类型的对象,并返回一个boolean类型值。当该方法返回true时,说明该元素符合条件,将被保留在Stream中。

例如以下代码:

List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<String> stream = list.stream().filter(s -> s.length() > 5);

其中的lamdba表达式s -> s.length() > 5用于筛选长度大于5的字符串。

map

映射方法map用于将Stream中的元素根据指定规则进行转换。其函数式接口为Function<T, R>,其方法为R apply(T t),接受一个T类型的对象,并返回一个R类型的对象。实质上,map方法就是对Stream中各元素做一个同类型的映射。

例如以下代码:

List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<Integer> stream = list.stream().map(String::length);

其中的方法引用String::length用于将每个字符串对象转换成其长度值。

sorted

排序方法sorted用于对Stream中的元素进行排序。其函数式接口为Comparator<T>,其方法为int compare(T o1, T o2),接受两个T类型的对象,并返回一个int类型值。当返回值为负数时,说明o1应排在o2前面;当返回值为正数时,说明o1应排在o2后面;当返回值为0时,说明o1与o2的顺序不确定。

例如以下代码:

List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
Stream<String> stream = list.stream().sorted();

其中,Stream将使用默认的排序规则对元素进行排序。

distinct

去重方法distinct用于将Stream中的重复元素去除,只保留一个。其使用equals方法进行比较,因此需要保证数据源中的元素正确实现了equals方法。

例如以下代码:

List<String> list = Arrays.asList("apple", "banana", "orange", "banana");
Stream<String> stream = list.stream().distinct();

其中,Stream中的元素"banana"出现了两次,但在调用distinct方法后,只保留了一次的"banana"元素。

count

计数方法count用于返回Stream中元素的数量,返回值为long类型。

例如以下代码:

List<String> list = Arrays.asList("apple", "banana", "orange", "pear");
long count = list.stream().count();

其中,count方法返回的值为4,即Stream中元素的数量。

reduce

归约方法reduce用于将Stream中的元素归约成一个值。其函数式接口为BinaryOperator<T>,其方法为apply(T t1, T t2),用于对两个T类型值进行归约,返回一个T类型值。reduce方法接受两个参数:第一个参数表示归约操作的初始值,可以为任意类型的对象;第二个参数为一个BinaryOperator类型的对象,用于对Stream中所有元素递归地进行归约操作。

例如以下代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, Integer::sum);

forEach

forEach方法用于对Stream中的每个元素执行指定的操作,其函数式接口为Consumer<T>,其方法为void accept(T t)forEach是一个终端操作,对于同一个Stream只能进行一次,一旦执行了终端操作,该Stream就不能再重复使用了。

例如以下代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(System.out::println);

其中,先通过stream方法将集合转换为Stream流,接着使用forEach方法对每个整数进行输出,最终输出结果为:

1
2
3
4
5

三、总结

Stream是Java 8中非常重要的一个API,可以极大地方便我们对列表、集合等数据源进行连续操作。Stream操作可以极大地简化我们的代码,提高效率,因此在Java编程中应该熟练使用Stream。需要注意的是,在对Stream进行操作时,应该注意Stream的惰性计算特性,以避免不必要的计算开销。文章来源地址https://www.toymoban.com/news/detail-578233.html

到了这里,关于Java中Stream流详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java stream流中peek用法详解

    在Java中,Stream是一种用于处理集合数据的强大工具。它提供了一种函数式编程的方式来对数据进行操作和转换。Stream中的 peek 方法是一种非终端操作,它允许你在流的每个元素上执行一个操作,而不会改变流的内容。 peek 方法的语法如下: 其中, action 是一个接收一个元素并

    2024年02月05日
    浏览(40)
  • Java中Stream流式计算的用法详解

    在Java 8之后,引入了Stream API,它是一个函数式编程的思想,其主要作用是将集合Stream化,可以使用一条语句对集合进行过滤、排序、统计等多种操作。接下来我们将详细介绍Java中Stream流式计算的用法。 Stream 接口是Java中定义的一个操作集合的高级抽象,它提供了大量的操作

    2024年02月01日
    浏览(49)
  • Java 8 中的 Stream API - map() 方法详解

    摘要: Java 8 中的 Stream API 提供了一种新的处理集合和数组的方式,可以使代码更加简洁、易读,同时还可以提高性能。其中 map() 方法是比较常用的方法之一,它可以将 Stream 对象中的每个元素映射为另一个元素。本文将对 Java 8 中的 Stream API 和 map() 方法进行详细介绍,并通

    2024年04月09日
    浏览(43)
  • Java Stream常见用法汇总,开发效率大幅提升

    本文已经收录到Github仓库,该仓库包含 计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享 等核心知识点,欢迎star~ Github地址 如果访问不了Github,可以访问gitee地址。 gitee地址 Java8 新增的

    2023年04月14日
    浏览(55)
  • 提高Java开发生产力,我选Stream API,真香啊

    Java 8 引入的Stream API提供了一种新的数据处理方式,它以声明式、函数式的编程模型,极大地简化了对集合、数组或其他支持数据源的操作。Stream可以被看作是一系列元素的流水线。允许你高效地对大量数据执行复杂的过滤、映射、排序、聚合等操作,而无需显式地使用循环

    2024年02月19日
    浏览(33)
  • 利用java语言中的stream流操作判断一个数组中是否有重复元素

    判断数组中是否有重复元素可以说是每一个编程语言初学者都会遇到的题目,常见的各种搜索算法本文不做赘述了,我们这次介绍的是利用java语言中特有的stream流操作来判断通用类型数组是否包含重复元素。 首先我们声明一个泛型方法: 表明该方法适用于所有类型的数组。

    2024年02月12日
    浏览(32)
  • Java 8 Stream API 中的 peek() 方法详解,以及需要注意的坑。

    在Java 8中,Stream API引入了许多强大的函数式编程特性,极大地增强了我们对集合数据进行操作的能力。其中一个很有用的方法就是 peek() ,本文将详细介绍其功能及应用场景。 peek() 是Java 8 Stream API中的一个中间操作方法,它的主要功能是对流中的每个元素执行一个操作(可以

    2024年04月16日
    浏览(31)
  • 【Stream流】java中Stream流详细使用方法

    在Java中, Stream 是一种用于处理集合数据的流式操作API。它提供了一种简洁、灵活、高效的方式来对集合进行各种操作,如过滤、映射、排序等。下面是一些 Stream 的常用功能和详细的代码示例: 创建流: 从集合创建流: stream() 方法可以从集合创建一个流。 从数组创建流:

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包