2017-01-04 3 views
2

У меня есть два типа, как эти:Multiline Java поток Collect бросает

@Data 
public class SomePersonType { 

    private String name; 

    private int age; 
} 

и

@Data 
@Builder 
public class SomeOtherPersonType { 

    private String name; 

    private int age; 
} 

Мне нужно преобразовать карту одного типа к другому. Итак, мой код выглядит так:

Мой настоящий код содержит много других атрибутов. Итак, я не хочу делать entry.getValue() несколько раз. Я хочу поместить его в локальную переменную, а затем использовать ее. Что-то вроде этого:

public class Main { 

    public static void main(final String... args) { 
     final Map<String, SomePersonType> somePersonTypeMap = new HashMap<>(); 

     // ... 
     // populating the map above with some values 
     // ... 

     final Map<String, SomeOtherPersonType> someOtherPersonTypeMap = somePersonTypeMap.entrySet().stream() 
       .collect(Collectors.toMap(
         Map.Entry::getKey, 
         entry -> { 
          final SomePersonType somePersonType = entry.getValue(); 
          SomeOtherPersonType.builder() 
            .name(somePersonType.getName()) 
            .age(somePersonType.getAge()) 
            .build(); 
         } 
       )); 
    } 
} 

Но я получаю две ошибки компилятора:

Map.Entry::getKey ->Non-static method cannot be referenced from a static context. entry.getValue() ->Cannot resolve method 'getValue()'

Может кто-нибудь указать мне, что я делаю неправильно? Благодарю.

+3

Кажется, что вы забыли 'return' перед' SomeOtherPersonType.builder() ... ' –

ответ

2

Что касается лямбда-выражения, то, окончательное утверждение должно возвращать значение, так что отображение значения Function возвращает переведённый значение:

Map<String, SomeOtherPersonType> someOtherPersonTypeMap = somePersonTypeMap.entrySet() 
      .stream() 
      .collect(Collectors.toMap(
        Map.Entry::getKey, 
        entry -> { 
         final SomePersonType somePersonType = entry.getValue(); 
         return SomeOtherPersonType.builder() 
           .name(somePersonType.getName()) 
           .age(somePersonType.getAge()) 
           .build(); 
        } 
      )); 

Однако, так как вы используете строитель, то почему не имеют строитель Заботьтесь создания SomeOtherPersonType из SomePersonType:

public SomeOtherPersonType fromSomePersonType(SomePersonType) { 
    ... 
} 

Таким образом, вы можете сделать:

Map<String, SomeOtherPersonType> someOtherPersonTypeMap = somePersonTypeMap.entrySet() 
      .stream() 
      .collect(Collectors.toMap(
        Map.Entry::getKey, 
        entry -> SomeOtherPersonType.builder() 
           .fromSomePersonType(entry.getValue()) 
           .build() 
      ));