欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Java中Stream流的使用方式案例详解

Java中Stream流的使用方式案例详解

2025/5/9 5:17:25 来源:https://blog.csdn.net/weixin_43810067/article/details/144730684  浏览:    关键词:Java中Stream流的使用方式案例详解

Stream 使用方式解释

代码背景

以下代码片段通过 Java 的 stream 流处理方式从 JSONArray 中提取所有元素的 Constants.NAME 属性,并将结果收集到一个列表中:

    @Testvoid test() {JSONArray nodes = new JSONArray();String[] names = {"df1", "df2", "df3"};for (String name : names) {JSONObject obj = new JSONObject();obj.put(Constants.NAME, name);nodes.add(obj);}List<String> dfname = nodes.stream().map(node -> (String) ((JSONObject) node).get(Constants.NAME)).collect(Collectors.toList());// 输出验证System.out.println(dfname); // [df1, df2, df3]}

功能解释

  1. 通过流对数组中的每个元素进行处理

    • 调用了 nodes.stream()JSONArray 转换为一个流(Stream)。
  2. 映射操作

    • 使用 map 方法对流中的每个元素应用转换操作,将 JSONObjectNAME 属性提取为 String
    • (String) ((JSONObject) node).get(Constants.NAME) 将每个 node(原始是 JSONObject)中的 Constants.NAME 对应的值提取出来并转换为 String
  3. 收集为列表

    • 使用 Collectors.toList() 将流的结果收集到一个新的 List 中。

问题说明

  • 在代码中,JSONArray 是阿里巴巴的 JSON 库(fastjson)。
  • nodes 是一个 JSONArray,其 stream() 方法是从父类继承的。
  • 每个 node 实际上是一个 JSONObject

代码逻辑可以正常工作,但需要注意以下几点:


优化建议

  1. 增强代码可读性
    可以让代码更清晰:

    List<String> dfname = nodes.stream().map(node -> (String) ((JSONObject) node).get(Constants.NAME)).collect(Collectors.toList());
    
  2. 避免类型转换警告
    如果编译时出现类型转换警告,可以通过以下方式避免:

    List<String> dfname = nodes.stream().map(JSONObject.class::cast).map(json -> json.getString(Constants.NAME)).collect(Collectors.toList());
    
    • JSONObject.class::cast 将每个元素转换为 JSONObject,确保类型安全。
    • json.getString(Constants.NAME)fastjson 提供的更简洁的获取字符串的方法,替代 (String) json.get(...)

测试示例

    @Testvoid test() {JSONArray nodes = new JSONArray();String[] names = {"df1", "df2", "df3"};for (String name : names) {JSONObject obj = new JSONObject();obj.put(Constants.NAME, name);nodes.add(obj);}// 流式操作List<String> dfname = nodes.stream().map(JSONObject.class::cast).map(json -> json.getString("name")).collect(Collectors.toList());// 输出验证System.out.println(dfname); // [df1, df2, df3]boolean df1 = dfname.contains("df1");boolean df2 = dfname.contains("df2222");System.out.println(df1);System.out.println(df2);}

输出

[df1, df2, df3]
true
false


.collect(Collectors.toList());.collect(toList()); 的区别

.collect(Collectors.toList());.collect(toList()); 本质上是等效的。两者都用于将流中的元素收集到一个 List 中。但是,它们之间的主要区别在于 方法引用的静态导入代码风格

区别分析

1. .collect(Collectors.toList());

  • 是一种完整的写法,显式地使用 Collectors.toList() 方法。
  • 不需要静态导入,代码的意图更明确。
  • 缺点是显得稍微冗长。

2. .collect(toList());

  • 需要静态导入 java.util.stream.Collectors.toList 方法。
  • 静态导入后可以省略 Collectors.,代码更简洁。
  • 依赖静态导入,可能会让代码在阅读时需要结合上下文才能清楚实际方法。

示例代码

使用 Collectors.toList()

@Test
void testWithCollectors() {List<String> list = Stream.of("A", "B", "C").collect(Collectors.toList()); // 完整写法
}

使用 toList() (静态导入)

import static java.util.stream.Collectors.toList;@Test
void testWithStaticImport() {List<String> list = Stream.of("A", "B", "C").collect(toList()); // 静态导入方式
}

使用建议

  1. 明确性优先

    • 当团队中存在新手或对静态导入感到不熟悉时,推荐使用 Collectors.toList() 这种完整的形式。
  2. 简洁性优先

    • 对于内部代码或约定明确的项目,可以使用静态导入 toList() 的形式。

总结

两者的功能和效果没有任何差异,主要区别在于代码的书写方式。

  • 完整写法Collectors.toList() 明确而冗长。
  • 静态导入写法toList() 简洁而依赖上下文。

选择具体写法时可以根据代码的风格要求、团队的熟悉程度进行选择。



版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词