2016-10-18 81 views
1

我已经创建了一个遍历字符串列表并使用ObjectMapper readValue方法将其转换为POJO列表的方法。使用带有ObjectMapper的Java 8 Stream readValue方法

public static <T> List<T> mapPayloadListToPOJOList(List<String> payloadList, Class<T> pojo) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    List<T> pojoList = new ArrayList<>(); 
    for (String payload : payloadList) { 
     T mapped = mapper.readValue(payload, pojo); 
     pojoList.add(mapped); 
    } 
    return pojoList; 
} 
  1. 有没有一种方法,我可以使用Java 8流,而不是这个实现的?
  2. 你能否给我一个解决方案?

我试图使用map,但它不允许应用Class<T>参数。

回答

2

它可以非常容易地通过删除for循环并将其替换为流来完成,但是lambda表达式在处理已检查的异常时会遇到一些问题。

您可以使用单独的转换方法解决该问题,并处理该方法中的异常(通过将其记录或重新引发为未经检查的异常)。

public static <T> List<T> mapPayloadListToPOJOList(List<String> payloadList, Class<T> pojo) { 
     return payloadList.stream() 
          .map(string -> convert(string, pojo)) 
          .collect(Collectors.toList()); 
    } 

    public static <T> T convert(String string, Class<T> pojo) { 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      return mapper.readValue(string, pojo); 
     } catch (IOException e) { 
      throw new UncheckedIOException(e); 
     } 
    } 
+0

这就是我所缺少的,返回null值。 – BadNews

+1

这种“处理”异常的方式,会在一天内伤害你... – Holger

+0

Holger我知道,这不是处理异常的理想方式。我已经这样写了,只是为了解释流处理。 –

1

是的,看看这个link,你可以将列表转换成流,然后映射像

payloadList.stream() 
    .forEach(s -> mapper.readValue(s,pojo)) 
    .collect(Collectors.toList()); 
+0

此选项不起作用,我已经试过了。 – BadNews

2

的东西每个值认为应该已经map而不是forEach ..

payloadList.stream() 
    .map(s -> mapper.readValue(s, pojo)) 
    .collect(Collectors.toList()) 

区别在于,map使用提供的lambda将(s -> mapper.readValue(s, pojo))中的每个元素从原始List映射到新元素,而forEach对原始List中的每个元素执行side-effect,但不返回任何内容。

Java 8 stream tutorials

相关问题