2016-10-18 1 views
1

Я создал метод, который выполняет итерацию по списку строк и преобразует его в список POJO с использованием метода ObjectMapper readValue.Использование Java 8 Stream с методом ObjectMapper 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. Не могли бы вы предоставить мне решение?

Я пытался использовать карту, но это не позволяет применить параметр Class<T>.

ответ

2

Это можно сделать очень легко, удалив цикл for и заменив его потоком, но выражения лямбда сталкиваются с некоторыми проблемами при обработке проверенных исключений.

Вы можете решить эту проблему с помощью отдельного метода преобразования и обработать исключение в этом методе (либо путем его регистрации, либо путем его сверления в виде неконтролируемого исключения).

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

Это то, чего я отсутствовал, возвращая нулевое значение. – 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 отображает каждый элемент от оригинала List к новому элементу с использованием прилагаемой лямбда (s -> mapper.readValue(s, pojo)), тогда как forEach выполняет side-effect для каждого элемента в оригинале List, не возвращая ничего.

От Java 8 stream tutorials.

Смежные вопросы