2017-12-08 3 views
-2

Ich möchte eine List<Properies> in eine Map<String,String> mit jdk 8 Lambdas konvertieren, ohne eine for-Schleife. Die Karte sollte den Schlüssel als SubProperty.name und den Wert als Properties.value enthalten.Konvertieren Sie eine Liste von Objekt in Map <String, String> mit jdk 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

Ich stimme ab, diese Frage als off-topic zu schließen, weil: es sieht wie grundlegende Stromübung aus, die Hausaufgabe vorschlagen, aber ["3. Fragen, die nach Hausaufgabenhilfe fragen, müssen a einschließen ** Zusammenfassung der bisherigen Arbeit, um das Problem zu lösen **, und a ** Beschreibung der Schwierigkeit, die Sie haben, ** es zu lösen. "] (https://stackoverflow.com/help/on-topic). Der aktuelle Status Ihrer Frage erfüllt diese Anforderungen nicht. Verwenden Sie die [Bearbeiten] Option, um es zu verbessern. – Pshemo

+0

Lies auch [Offener Brief an Schüler mit Hausaufgabenproblemen] ( – Pshemo

Antwort

0

Etwas wie folgt aus:

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

Wenn konstruieren Sie ein Map von einem StreamCollectors.toMap() verwenden, müssen Sie prüfen, ob Ihre Stream doppelte Schlüssel enthalten. In Ihrem Fall bedeuten doppelte Schlüssel mehrere Properties Instanzen mit SubProperty mit dem gleichen Namen.

Zum Auflösen von Duplikaten können Sie die 3-Argument-Variante Collectors.toMap verwenden. Zum Beispiel wird im Folgenden eine der getValue() Werte wählen, wenn doppelte Schlüssel zu begegnen:

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

Eine weitere Option ist Collectors.groupingBy zu verwenden, die Gruppe würden die Werte, die den gleichen Schlüssel in ein List teilen:

Map<String,List<String>> map = 
    list.stream() 
     .collect(Collectors.groupingBy(p -> p.getSubProperty().getName(), 
             Collectors.mapping(Properties::getValue, 
                  Collectors.toList()))); 
+0

Der von Collectors.toMap erstellte Collector löst "IllegalStateException" aus, wenn versucht wird, einen Schlüssel zu speichern, der bereits in der Map vorhanden ist. Wenn Sie Elemente in einer Map sammeln möchten und doppelte Einträge in der Quelle erwarten, sollten Sie die Methode 'Collectors.toMap (Function, Function, BinaryOperator)' verwenden. Das ist die richtige und vollständige Antwort. –

+0

@AlexMamo * es sei denn, du weißt, du wirst keine Duplikate haben, und falls du willst, willst du * diese Ausnahme ... – Eugene

Verwandte Themen