2017-12-27 142 views
5

Ben sınıfı:Java 8 ve StringJoiner kullanarak bir listeden iki alanı nasıl birleştirebilirim?

public class Item { 

    private String first; 
    private String second; 

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

Ve böyle nesnelerin listesini:

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

Amacım aşağıdaki dizeyi inşa etmek amacıyla elemanların listesini katılmaktır: Ben

One: Two; Three: Four; 

ve StringJoiner kullanmayı denedi, ancak bazı basit türlerin listesi ile çalışmak üzere tasarlanmış gibi görünüyor.

Bir boşluk ayırarak alanları birleştirir ve daha sonra öğeleri katılmak bir dizeye öğeyi eşleyebilir

cevap

9

Sen böyle bir şeyi deneyebilirsiniz:

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

As Aşağıdaki yorumda belirtilen assylias, son ; bu yapı kullanılarak kaçırılacak. Son String'e manuel olarak eklenebilir veya assylias tarafından önerilen çözümü deneyebilirsiniz.

+1

Sen 'son özleyeceğim;' – assylias

+0

Bunun için önek/sonek aşırı kullanabilirsiniz. – shmosel

+0

@assylias Haklısın, yakaladığı için teşekkürler! –

10

:

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

Çok teşekkürler))) – Marian

2

İlk adım, field1 ve field2'a katılmaktır.

İkinci adım, ; ile katılmaktır.

Bu işlemin sonunda bir ; eklemeyeceğini unutmayın.

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

Biraz daha OO

Ya da daha iyisi: hamle mantığı özel bir yönteme field1 ve field2 katılmak için:

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

} 

Ve kullanmak akışında, bir.

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

Çok teşekkürler)))) – Marian