2017-12-08 1 views
-2

for 루프를 사용하지 않고 List<Properies>Map<String,String>으로 jdk 8 람다를 사용하여 변환하고 싶습니다. 맵은 키를 SubProperty.name으로, 값을 Properties.value로 포함해야합니다. 이 같은jdk를 사용하여 <String, String>을 사용하여 객체 목록 변환 8 lambdas

public class Properties 
{ 
    private SubProperty subProperty; 

    private String value; 

    public SubProperty getSubProperty() 
    { 
     return subProperty; 
    } 

    public void setSubProperty(SubProperty subProperty) 
    { 
     this.subProperty = subProperty; 
    } 

    public String getValue() 
    { 
     return value; 
    } 

    public void setValue(String value) 
    { 
     this.value = value; 
    } 
} 

public class SubProperty 
{ 
    private String category; 
    private String name; 

    public String getCategory() 
    { 
     return category; 
    } 

    public void setCategory(String category) 
    { 
     this.category = category; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 
} 
+1

http://idownvotedbecau.se/noattempt/ – Moira

+0

나는 숙제를 제안하는 기본 스트림 훈련처럼 보이지만 [ "3. 숙제 도움을 요청하는 질문은 ** 문제를 해결하기 위해 지금까지해온 작업 요약 **, ** 어려움에 대한 설명은 ** 해결 중입니다. "] (https://stackoverflow.com/help/on-topic). 귀하의 질문의 현재 상태가 이러한 요구 사항을 충족시키지 못합니다. 그것을 향상 시키려면 [편집] 옵션을 사용하십시오. – Pshemo

+0

또한 이것을 읽으십시오 [숙제 문제에 학생에게 열려있는 편지] (http://meta.programmers.stackexchange.com/q/6166) – Pshemo

답변

0

뭔가 : 당신이 Collectors.toMap()를 사용하여 Stream에서 Map를 구성

List<Properties> properties = ... 
Map<String, String> map = properties.stream() 
    .collect(Collectors.toMap(prop -> prop.getSubProperty().getName(), prop -> prop.getValue())); 
0

, 당신은 당신의 Stream가 중복 키를 포함 할 수 있는지 여부를 고려해야합니다. 귀하의 경우에는 중복 키가 동일한 이름을 가진 복수 Properties 인스턴스가 SubProperty 인 것을 의미합니다.

중복을 해결하려면 Collectors.toMap의 3 인수 변형을 사용할 수 있습니다.

Map<String,List<String>> map = 
    list.stream() 
     .collect(Collectors.groupingBy(p -> p.getSubProperty().getName(), 
             Collectors.mapping(Properties::getValue, 
                  Collectors.toList()))); 
: 그룹 값이 List에 동일한 키를 공유 할

Map<String,String> map = 
    list.stream() 
     .collect(Collectors.toMap(p -> p.getSubProperty().getName(), 
            Properties::getValue, 
            (v1,v2) -> v1)); 

또 다른 옵션은 Collectors.groupingBy을 사용하는 것입니다 : 중복 키가 발생한 경우 예를 들어, 다음은 getValue() 값 중 하나를 선택합니다

+0

Map에 이미 존재하는 키를 저장하려고하면 Collectors.toMap에 의해 생성 된 Collector가 IllegalStateException을 던집니다. 맵에서 항목을 수집하고 원본에서 중복 항목을 예상하는 경우'Collectors.toMap (Function, Function, BinaryOperator) '메소드를 사용해야합니다. 그것이 옳고 완전한 대답입니다. –

+0

@AlexMamo * 당신은 u가 중복되지 않을 것이라는 것을 안다. 그리고 만약 당신이 * 예외 *를 원한다면 ... – Eugene

관련 문제