2017-12-08 3 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'をスローします。 Map内のアイテムを収集したい場合は、ソースに重複するエントリがある場合は、 'Collectors.toMap(Function、Function、BinaryOperator)'メソッドを使用する必要があります。それは正しい、完全な答えです。 –

+0

@AlexMamo *あなたがあなたに重複を持たないことを知っていないなら、もしあなたが*その例外を欲しがる場合は... – Eugene

関連する問題