您的位置:首页 > 健康 > 美食 > 企业网站的网页设计_加强网络平台建设_百度托管公司_seo多久可以学会

企业网站的网页设计_加强网络平台建设_百度托管公司_seo多久可以学会

2024/10/11 17:59:46 来源:https://blog.csdn.net/weixin_45638884/article/details/142812798  浏览:    关键词:企业网站的网页设计_加强网络平台建设_百度托管公司_seo多久可以学会
企业网站的网页设计_加强网络平台建设_百度托管公司_seo多久可以学会

首先来看一段代码

Map<Integer, JSONObject> nodeMap = jsonArray.stream().map(obj -> (JSONObject) obj).peek(json -> json.put("children", new ArrayList<JSONObject>())).collect(Collectors.toMap(json -> json.getInteger("id"), json -> json));

这段代码的作用是将一个 JSONArray 对象转换成一个 Map<Integer, JSONObject>, 并为每个对象预先创建了一个 children 的空列表。

其中键是每个 JSONObject"id" 属性值,值是相应的 JSONObject 对象,并为每个对象添加一个空的 children 列表。它通过 Java Stream API 实现了这一转换,具体过程如下:

  1. stream():将 jsonArray 转换为流(Stream),以便应用后续的操作。

  2. map(obj -> (JSONObject) obj):将流中的每个对象(默认为 Object 类型)强制转换为 JSONObject 类型。

  3. peek(json -> json.put("children", new ArrayList<JSONObject>())):对流中的每个 JSONObject 对象执行副作用操作,向其中添加一个 "children" 字段,该字段是一个空的 ArrayList<JSONObject>

  4. collect(Collectors.toMap(...)):将流中的每个 JSONObject 转换为 Map,其中键是 JSONObject 中的 "id" 字段,值是该 JSONObject 本身。

  5. json.getInteger("id") 假定了 JSONObject 中的 id 字段是 Integer 类型,如果这个字段不存在或不是整数类型,可能会抛出异常。

  6. peek 用于在不终止流的情况下对流中的元素执行额外操作,比如这里添加 "children"

看了上面代码可能会有个疑问? 为什么json -> json.put(“children”, new ArrayList())要写在peek()中而不是写在map()中

json -> json.put("children", new ArrayList<JSONObject>()) 写在 peek() 中而不是 map() 中的原因主要与这两个方法在 Java Stream API 中的用途和行为有关。

peek()map() 的区别:

  1. peek()

    • 用于在不干扰或修改流中元素的情况下,对每个元素执行一个动作(副作用)。
    • 典型用法是用来调试或执行某些操作,比如日志记录、打印或修改某个对象的状态。
    • 它返回的是原始流,不会对流中的元素进行变换。
  2. map()

    • 用于将流中的每个元素转换为另一个对象或值。
    • 其主要功能是对流中的每个元素应用一个函数,并返回一个新的流,流中的每个元素都会被映射到新的值。

为什么在 peek() 而不是 map() 中?

  • json.put("children", new ArrayList<JSONObject>()) 只是对 JSONObject 中的内容做了修改,但并没有生成一个新的对象。
  • 如果使用 map(),则通常是为了将流中的每个元素转换为新的对象或者新的类型,这里并不需要将 JSONObject 转换成其他东西,而只是修改了它的状态(添加了一个 children 字段)。

具体场景分析:

.peek(json -> json.put("children", new ArrayList<JSONObject>()))
  • peek() 的作用是给每个 JSONObject 添加 children 字段,但不会改变 JSONObject 的引用或类型。
  • 因为你并不需要修改流中元素的结构或类型,只是想附加某个动作,peek() 是更合适的选择。

如果将此操作放在 map() 中,则会违反 map() 的设计目的(转换元素)。而使用 peek() 可以达到你的目的,即在不改变流内容的情况下进行操作。

总结:

  • peek() 是用于执行副作用而不改变流元素的。
  • map() 是用于对流中的元素进行变换并返回一个新的流。

在此场景中,peek() 更合适,因为你只是对元素做了修改,而不是将其转换成一个新的对象。

版权声明:

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

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