2017-12-27 13 views
5

私はクラスを持っている:Java 8とStringJoinerを使用してリストから2つのフィールドを連結するにはどうすればよいですか?

public class Item { 

    private String first; 
    private String second; 

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

そして、このようなオブジェクトのリスト:

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

私の目標は、次の文字列を構築するために、要素のリストに参加することです:

One: Two; Three: Four; 

私は」 StringJoinerを使用しようとしましたが、単純なタイプのリストで動作するように設計されているようです。

あなたがスペースで区切っ、フィールドを連結して、アイテムに参加した文字列に項目をマッピングすることができ

答えて

9

は、あなたがそのような何かを試すことができます。

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

として、下のコメントに記載されているassylias、最後に;がこの構造を使用して見逃されます。これは最終的なStringに手動で追加することも、単にassyliasによって提案された解決策を試すこともできます。

+1

あなたは '最後欠場する;' – assylias

+0

あなたはそのために接頭語/接尾辞のオーバーロードを使用することができます。 – shmosel

+0

@assyliasあなたは正しいです、キャッチのためにありがとう! –

10

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

どうもありがとう))) – Marian

2

最初のステップは、field1field2に参加することです。

第2ステップは;と参加することです。

最後に;が追加されないことに注意してください。まだ

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

またはそれ以上:移動ロジックは、専用のメソッドにfield1field2に参加する:

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

} 

ストリームで1つを使用します。

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

ありがとう))) – Marian

関連する問題