私は Guava が大好きで、グアバをこれからもずっと使い続けます。しかし、それが理にかなっている場合は、代わりにJava 8)の「新しいもの」を使用しようとします。
「問題」
String
のURL属性を結合したいとしましょう。 Guavaでは、次のようにします。
Map<String, String> attributes = new HashMap<>();
attributes.put("a", "1");
attributes.put("b", "2");
attributes.put("c", "3");
// Guava way
String result = Joiner.on("&").withKeyValueSeparator("=").join(attributes);
result
はa=1&b=2&c=3
。
質問
Java 8(サードパーティのライブラリなし))でこれを行う最もエレガントな方法は何ですか?
マップのエントリセットのストリームを取得し、各エントリを目的の文字列表現にマップし、 Collectors.joining(CharSequence delimiter)
を使用してそれらを単一の文字列に結合できます。
_import static Java.util.stream.Collectors.joining;
String s = attributes.entrySet()
.stream()
.map(e -> e.getKey()+"="+e.getValue())
.collect(joining("&"));
_
ただし、エントリのtoString()
はすでに_key=value
_形式でコンテンツを出力しているため、toString
メソッドを直接呼び出すことができます。
_String s = attributes.entrySet()
.stream()
.map(Object::toString)
.collect(joining("&"));
_
public static void main(String[] args) {
HashMap<String,Integer> newPhoneBook = new HashMap(){{
putIfAbsent("Arpan",80186787);
putIfAbsent("Sanjay",80186788);
putIfAbsent("Kiran",80186789);
putIfAbsent("Pranjay",80186790);
putIfAbsent("Jaiparkash",80186791);
putIfAbsent("Maya",80186792);
putIfAbsent("Rythem",80186793);
putIfAbsent("Preeti",80186794);
}};
/**Compining Key and Value pairs and then separate each pair by some delimiter and the add prefix and Suffix*/
String keyValueCombinedString = newPhoneBook.entrySet().stream().
map(entrySet -> entrySet.getKey() + ":"+ entrySet.getValue()).
collect(Collectors.joining("," , "[","]"));
System.out.println(keyValueCombinedString);
/**
* OUTPUT : [Kiran:80186789,Arpan:80186787,Pranjay:80186790,Jaiparkash:80186791,Maya:80186792,Sanjay:80186788,Preeti:80186794,Rythem:80186793]
*
* */
String keyValueCombinedString1 = newPhoneBook.entrySet().stream().
map(Objects::toString).
collect(Collectors.joining("," , "[","]"));
System.out.println(keyValueCombinedString1);
/**
* Objects::toString method concate key and value pairs by =
* OUTPUT : [Kiran=80186789,Arpan=80186787,Pranjay=80186790,Jaiparkash=80186791,Maya=80186792,Sanjay=80186788,Preeti=80186794,Rythem=80186793]
* */
}
> Blockquote