文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中Stream流详解

2023-08-25 16:26

关注

今天在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(); // 串行StreamStream<String> parallelStream = list.parallelStream(); // 并行Stream

二、常用的Stream操作方法

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

filter

过滤方法filter用于对Stream中的元素进行筛选,只保留符合指定条件的元素。其函数式接口为Predicate,其方法为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,其方法为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,其方法为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,其方法为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,其方法为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方法对每个整数进行输出,最终输出结果为:

12345

三、总结

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

来源地址:https://blog.csdn.net/weixin_52357829/article/details/131177398

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯