2017-12-27 141 views
5

Tôi có lớp:Làm thế nào tôi có thể nối hai trường từ một danh sách bằng cách sử dụng Java 8 và StringJoiner?

public class Item { 

    private String first; 
    private String second; 

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

Và danh sách các đối tượng như:

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

Mục tiêu của tôi là để gia nhập danh sách các yếu tố để xây dựng chuỗi sau:

One: Two; Three: Four; 

tôi đã cố gắng sử dụng StringJoiner, nhưng có vẻ như nó được thiết kế để làm việc với danh sách một số loại đơn giản.

Trả lời

9

Bạn có thể thử một cái gì đó như thế:

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

Như assylias được đề cập trong nhận xét bên dưới, ; cuối cùng sẽ bị bỏ qua khi sử dụng công trình này. Nó có thể được thêm thủ công vào chuỗi cuối cùng hoặc bạn chỉ có thể thử giải pháp được đề xuất bởi assylias.

+1

Bạn sẽ bỏ lỡ cuối cùng '; ' – assylias

+0

Bạn có thể sử dụng quá tải tiền tố/hậu tố cho điều đó. – shmosel

+0

@assylias Bạn nói đúng, cảm ơn vì đã bắt! –

10

Bạn có thể lập bản đồ các mục để một chuỗi móc nối các lĩnh vực và sau đó tham gia các mục, tách chúng với một không gian:

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

Thanks a lot))) – Marian

2

Bước đầu tiên là tham gia field1field2.

Bước thứ hai là tham gia với ;.

Lưu ý rằng điều này sẽ không thêm ; ở cuối.

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

OO Hơi nhiều

Hoặc tốt hơn: di chuyển logic để tham gia field1field2 đến một phương pháp chuyên dụng:

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

} 

Và sử dụng một trong các suối.

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

Cảm ơn rất nhiều))) – Marian

Các vấn đề liên quan