目次
この記事は2分ほどで読めます。
1. 要素の結合
2. 解決方法
3. 要素を変換してから結合
1. 要素の結合
- 要素を結合する際に「最後の要素の後にコンマがついてしまうな~」と思ったことはないでしょうか。
List<String> persons = List.of("satoshi", "takeshi", "haruka", "masato");
for (String person : persons) {
System.out.print(person + ","); // satoshi,takeshi,haruka,masato, となってしまう!!
}
- これをforループを用いて解決しようとすると少しややこしいコードを書かなければなりません。
for (int i = 0; i < persons.size() - 1; i++) {
System.out.print(persons.get(i) + ","); // satoshi,takeshi,haruka,
}
// 最後の要素を取得
if (persons.size() > 0) {
System.out.println(persons.get(persons.size() - 1)); // masato
}
2. 解決方法
- 以下のようにするとシンプルに問題解決できます。
System.out.println(String.join(",", persons)); // satoshi,takeshi,haruka,masato
- Java8で加わったStringJoinerクラスと、Stringクラスに実装されたjoin()メソッドを使用しましょう。
- join()は裏でStringJoinerクラスを呼び出し、1つ目の引数を区切り値として、2つ目以降の引数として渡された値を統合します。
3. 要素を変換してから結合
- さて、単に要素を結合するだけではなく「結合前に何らかの処理をしたい」「要素の絞り込みをした後に結合をしたい」というケースもあると思われます。
- その場合はstreamAPIを使用しましょう。
- 例えば
要素を大文字に変換して結合する
という処理を書いてみましょう。
System.out.println(
persons.stream()
.map(String::toUpperCase)
.collect(Collectors.joining(","))); // SATOSHI,TAKESHI,HARUKA,MASATO
- map()で変換をし、変換されたリストでcollect()という集約処理を行うメソッドを呼び出しています。
- collect()内でCollectersクラスのjoin()を呼び出します。
「ラムダ式やStreamAPI使うの難しそうだし嫌だな~」と思われている方もいらっしゃるかと思います(私もプログラミング初心者の頃は避けてきました笑)
では従来の方法で、同じ処理を書いて比較してみましょう。
StringBuilder resultBuilder = new StringBuilder();
for (int i = 0; i < persons.size(); i++) {
String person = persons.get(i).toUpperCase();
resultBuilder.append(person);
if (i < persons.size() - 1) {
resultBuilder.append(",");
}
}
System.out.println(resultBuilder.toString());
-
2つの処理方法をぱっと見比べたときにどちらが可読性が高いでしょうか?
-
大半の人はStreamAPIを使用した方法と答えると思われます。
-
またコーディング量も削減できるので良いですね。
(ラムダ式・StreamAPIの解説については今後発信予定です。ぜひ「いいね&フォロー」してお待ちください!) -
ちなみにcollect()ではなくreduce()を使って今回の処理を記述することも可能です。
System.out.println(
persons.stream()
.map(String::toUpperCase)
.reduce((x, y) -> x + "," + y)
.orElse(null));
- 個人的にはコーディング量的にもcollect()を使う方をおすすめします
いかがでしたでしょうか。
ご好評であれば、他にも詰まりそうな点も記事にしていこうと思います。