2017-11-01 2 views
2

Ich habe eine Liste von Objekten, die aus BankId, IdentifierId und IdentifierValue besteht. Für jede Bank habe ich mehr als einen identifierValue. Meine Anforderung besteht darin, eine Map zu erstellen, indem ich die List basierend auf bankId gruppiere und den identifierValue in eine durch/getrennte Zeichenfolge aufzeichne.Java 8 Stream Gruppe und verketten Zeichenfolgen mit einem Trennzeichen

zB:

Bank of America, identifer-1, 123 
Bank of America, identifer-2, 234 
wells Forgo,  identifier-1, 123 

Ich möchte das Ergebnis eine Karte sein, wie unten

bank of America -> 123/234 
wellsForgo -> 123 

Klasse:

public class BankIdentifier { 
    private String bankId; 
    private String identifierId; 
    private String identifierValue; 
} 

Ich bin mit Java 8 Streams groupby, aber ich bin nicht in der Lage, den Identifier-Wert getrennt durch /

zu erhalten
+0

Können Sie uns Ihren bestehenden Code zeigen? – dash2

+1

Warum möchten Sie den Schrägstrich-Trennzeichen? Das ist nur ein Rendering-Problem. Es ist besser, nach Namen zu gruppieren, die einer Liste von Objekten zugeordnet sind, die standardmäßig unterstützt werden. Die Liste als slash-limited-Liste von identifierValues ​​zu rendern ist trivial mit stream-> map-> collect (joining). – Bohemian

+0

Was hast du bisher versucht? – seal

Antwort

3

Dies würde die Liste basierend auf bankId und identifierValue in einer einzigen Zeichenfolge getrennt durch / Trennzeichen gruppieren.

Map<String, String> result = 
       items.stream().collect(
         Collectors.groupingBy(BankIdentifier::getBankId, 
           Collectors.mapping(BankIdentifier::getIdentifierValue, Collectors.joining("/"))) 
         ); 

Sicherstellen, dass ein Getter für bankId und identifierValue haben, um die Methode Referenzsyntax zu verwenden.

+1

Danke Es hat funktioniert. – rroy

2

können Sie einen Stream verwenden und dann sammeln, die Gruppierung durch, Mapping und Verbinden wie in Aominè's answer, oder Sie können es ohne Ströme tun:

Map<String, String> result = new HashMap<>(); 
bankIdentifiers.forEach(b -> 
    result.merge(b.bankId, b.identifierValue, (o, n) -> o + "/" + n)); 

Dies verwendet die Map.merge Verfahren die Kennung Werte verketten.