2014-12-01 2 views
0

У меня есть метод, который просматривается под сообщением. Я хочу реорганизовать этот метод из «для каждого» для просмотра потока как myCollect.stream(). Collect (Collectors.toMap (..))) , но не понимаю, как это работает Collectors.toMap (..) ,Рефакторинг в Java 8 поток

private <T extends Entity> Map<String, Object> prepareEntity(T entity) throws Exception { 
     Map<String, Object> preparedEntity = new LinkedHashMap<>(Collections.EMPTY_MAP); 
     Objects.requireNonNull(entity); 
     Class clazz = entity.getClass(); 

     List<Field> openFields = getDeclaredFields(clazz, Collections.EMPTY_LIST); 

     for (Field field : openFields) { 
      field.setAccessible(true); 
      preparedEntity.put(field.getName(), field.getType().equals(Boolean.class) 
        ? ("true".equals(field.get(entity).toString())) ? 1 : 0 
        : field.get(entity)); 
     } 

     return preparedEntity; 
    } 

ответ

0

Это должно быть что-то вроде этого:

return openFields.stream() 
       .collect(Collectors.toMap(Field::getName, 
              field->field.getType().equals(Boolean.class)? 
                ("true".equals(field.get(entity).toString())) ? 1 : 0 
                : field.get(entity) 
              ) 
         ); 
+0

IDEA сообщение показать ошибку «Не удается разрешить метод" GetName»Я стараюсь, как сделал это, слишком – BabyGluk

+0

@BabyGluk ли' java.lang .reflect.Field'? У этого класса есть метод «Field :: getField», поэтому он должен работать. Вы можете попытаться заменить ссылку на метод выражением лямбда: 'field -> field.getName()'. – Eran

+3

Если это 'java.lang.reflect.Field', я бы использовал' field.getBoolean (entity)? 1: 0', а не этот странный '(« true ».equals (field.get (entity) .toString()))? 1: 0' ... – Holger

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