2017-12-27 145 views
5

mam klasa:Jak mogę połączyć dwa pola z listy używając Java 8 i StringJoiner?

public class Item { 

    private String first; 
    private String second; 

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

oraz wykaz takich obiektów:

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

Moim celem jest wykaz elementów przyłączyć, aby zbudować następujący ciąg:

One: Two; Three: Four; 

I ve próbował użyć StringJoiner, ale wygląda na to, że został zaprojektowany do pracy z listą prostych typów.

Odpowiedz

9

można spróbować coś takiego:

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

As assylias wspomniana w komentarzu poniżej, ostatnia ; zostanie pominięta przy użyciu tej konstrukcji. Można go dodać ręcznie do ostatecznego Stringa lub po prostu wypróbować rozwiązanie sugerowane przez assylias.

+1

Będziesz przegap ostatni ';' – assylias

+0

Można użyć przeciążenie prefiksu/sufiksu za to. – shmosel

+0

@assylias Masz rację, dzięki za połów! –

10

można odwzorować pozycję na sznurku, który skleja pola, a następnie dołączyć elementy, oddzielając je spacją:

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

dziękuję))) – Marian

2

Pierwszym krokiem jest dołączenie field1 i field2. Kolejny krok to połączenie z ;.

Należy pamiętać, że na końcu nie zostanie dodana ;.

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("; ")); 

Nieco bardziej OO

Albo jeszcze lepiej: logika ruch dołączyć field1 i field2 do dedykowanej metody:

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; 
    } 

} 

i używać jednego w strumieniu.

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

Dzięki dużo))) – Marian

Powiązane problemy