有效地遍历地图列表

Loop through a list of map effectively

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

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,它按预期工作,但它是正确的方法还是在性能方面有更好的方法?

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))  ;
        }
    }));
}

或者,您可以使用 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()));
            });
          });`
}

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

如果使用并行流迭代 list/maps,可能会实现一些性能改进。

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.Encoderclass 的实例可安全供多个并发线程使用。.