【问题标题】:Loop through a list of map effectively有效地遍历地图列表
【发布时间】:2022-01-23 13:09:13
【问题描述】:

基本上我有一个List<Map<String, Object>> listOfValue,我需要检查对象是否是字节实例,然后将其编码为字符串,如下所示:

private void convertByteToBase64(List<Map<String, Object>> listOfValue) {

Object value = null;


if (!CollectionUtils.isEmpty(listOfValue)) {

    for (Map<String, Object> map : listOfValue) {

        if (!map.isEmpty()) {

            for (Map.Entry<String, Object> entry : map.entrySet()) {

                value = entry.getValue();

                if (value instanceof byte[]) {

                    entry.setValue(Base64.getEncoder().encodeToString((byte[]) value));
                }
            }

        }

    }

}

}

我正在使用 java 8,它按预期工作,但它是正确的方法还是在性能方面有更好的方法?

【问题讨论】:

    标签: java list loops java-8 java-stream


    【解决方案1】:

    当前的实现似乎没问题,但是,检查列表和嵌套映射的空性似乎是多余的。

    如果使用并行流来迭代列表/映射,可能会实现一些性能改进。

    private void convertByteToBase64(List<Map<String, Object>> listOfValue) {
        Base64.Encoder base64encoder = Base64.getEncoder();
        listOfValue.parallelStream()
            .flatMap(map -> map.entrySet().parallelStream())
            .filter(entry -> entry.getValue() instanceof byte[])
            .forEach(entry -> entry.setValue(
                base64encoder.encodeToString((byte[]) entry.getValue())
            ));
    }
    

    Base64.Encoder 是线程安全的:Base64.Encoder 类的实例对于多个并发线程来说是安全的。.

    【讨论】:

    • null != entry.getValue() && entry.getValue() instanceof byte[],第一个条件好像也是多余的,entry.getValue() instanceof byte[]就够了
    • 好的,感谢您的关注,我编辑了redundant null-check out
    • @AlexRudenko 谢谢你的回答,一个快速的问题,为什么检查列表的空性和嵌套的地图是多余的?
    • @user1999453,在这里解释:Is calling isEmpty() before iterating redundant?
    【解决方案2】:

    或者,您可以使用 parallelStream 和过滤器,如下所示。

    private void convertByteToBase64(List<Map<String, Object>> listOfValue) {
               listOfValue.parallelStream().forEach(map -> {
                map.entrySet().parallelStream().filter(entry->entry.getValue() instanceof byte[]).forEach(entry -> {
                    entry.setValue(Base64.getEncoder().encodeToString((byte[]) entry.getValue()));
                });
              });`
    }
    

    【讨论】:

      【解决方案3】:
      public static void convertByteToBase64(List<Map<String, Object>> listOfValue) {
      
          listOfValue.stream().parallel()
                  .forEach(map -> map.forEach((key,value)->{
                      if(value instanceof byte[]) {
                          map.put(key, Base64.getEncoder().encodeToString((byte[])value))  ;
              }
          }));
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 2018-02-14
        • 2017-07-23
        • 2019-08-24
        相关资源
        最近更新 更多