2017-12-27 22 views
5

Ich habe Klasse:Wie kann ich zwei Felder aus einer Liste mit Java 8 und StringJoiner verketten?

public class Item { 

    private String first; 
    private String second; 

    public Item(String first, String second) { 
     this.first = first; 
     this.second = second; 
    } 
} 

Und Liste solcher Objekte:

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four")); 

Mein Ziel ist die Liste der Elemente zu verbinden, um folgende Zeichenfolge zu erstellen:

One: Two; Three: Four; 

I‘ Ich habe versucht, StringJoiner zu verwenden, aber es sieht so aus, als ob es mit einer Liste einfacher Typen zusammenarbeitet.

Antwort

9

Sie so etwas versuchen:

final String result = items.stream() 
     .map(item -> String.format("%s: %s", item.first, item.second)) 
     .collect(Collectors.joining("; ")); 

Wie assylias im Kommentar erwähnt, letzte ; wird mit dieser Konstruktion verpasst werden. Es kann manuell zum letzten String hinzugefügt werden oder Sie können einfach die von assylias vorgeschlagene Lösung ausprobieren.

+1

Sie das letzte 'verpassen;' – assylias

+0

Sie können das Präfix/Suffix Überlastung dafür. – shmosel

+0

@assylias Du hast Recht, danke für den Fang! –

10

Sie können den Artikel in eine Zeichenfolge zuordnen können, die die Felder verkettet und dann die Elemente verbinden, so dass sie mit einem Leerzeichen zu trennen:

String result = items.stream() 
        .map(it -> it.field1 + ": " + it.field2 + ";") 
        .collect(Collectors.joining(" ")); 
+0

Vielen Dank))) – Marian

2

Der erste Schritt besteht darin, field1 und field2 beizutreten.

Zweiter Schritt ist die Verbindung mit ;.

Beachten Sie, dass dies am Ende kein ; hinzufügen wird.

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four")); 

String joined = items.stream() 
     // First step 
     .map(it -> it.field1 + ": " + it.field2) 
     // Second step 
     .collect(Collectors.joining("; ")); 

Etwas mehr OO

Oder noch besser: move Logik field1 und field2 zu einem dedizierten Verfahren beizutreten:

public static class Item { 
    private String field1; 
    private String field2; 

    public Item(String field1, String field2) { 
     this.field1 = field1; 
     this.field2 = field2; 
    } 

    public String getField1And2() { 
     return field1 + ": " + field2; 
    } 

} 

und verwendet, die man in dem Strom.

String joined = items.stream() 
     .map(Item::getField1And2) 
     .collect(Collectors.joining("; ")); 
+0

Vielen Dank))) – Marian

Verwandte Themen