JAVA8 Streamで文字列をJoin

JavaのStreamクラスを使って、文字列のリストをJoin(デルミタを挟んで1つの文字列に)する方法を試してみた。

/**
 *
 */
package sample2;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author ssiscirine
 *
 */
public class Sample1 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		{
			System.out.println("☆文字の配列をJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add("bbb");
			lst.add("ccc");
			String[] ar = lst.toArray(new String[0]);
			System.out.println(String.join(", ", ar));
		}
		{
			System.out.println("☆nullを含む文字の配列をJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String[] ar = lst.toArray(new String[0]);
			System.out.println(String.join(", ", ar));
		}
		{
			System.out.println("☆nullを含む文字の配列からnullを取り除いてJOINING☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String str = lst.stream()
					.filter(i -> (i != null))
					.collect(Collectors.joining(", "));
			System.out.println(str);
		}
		{
			System.out.println("☆nullを含む文字の配列からnullを取り除いてJOIN☆");
			List<String> lst = new ArrayList<String>();
			lst.add("aaa");
			lst.add(null);
			lst.add("ccc");
			String[] ar = lst.stream()
					.filter(i -> (i != null))
					.toArray(String[]::new);
			System.out.println(String.join(", ", ar));
		}
	}
}
☆文字の配列をJOIN☆
aaa, bbb, ccc
☆nullを含む文字の配列をJOIN☆
aaa, null, ccc
☆nullを含む文字の配列からnullを取り除いてJOINING☆
aaa, ccc
☆nullを含む文字の配列からnullを取り除いてJOIN☆
aaa, ccc
    普通の文字列なら特に問題は無い。
    しかし、文字列にnullが混ざっていると、普通に null と表示してしまう。
    なので、StreamのFilterで取り除いてみる。
    最後は出力の仕方を他と合わせてみた。

StreamのtoArrayをパラメータ無しで使うとObject[]が戻ってくるがそれでは使いようが無いからString[]を返して貰いたい。
しかし、そのためにはListのtoArrayのようにnew String[0]ではなく、String[]::newと書かなければいけない特殊なルールが適用される。
ま、new String[0]だって、かなりマイ・ルール的であるけどね。(大笑
なぜこんなことを書いたかと云えば、古への勘違いの伝承で、文字列の結合にはStringBuiderを用いよ。というのがある。
※servletでapplication/octet-stream形式でファイルをダウンロードさせるなら、Stringで返すよりも、StringBuiderからOutputStreamを作ってwriteに渡した方が速そう?な・・あたりから落ちてきたっぽい。⇒+++と何度も文字列の結合を繰り返すとメモリを捨てまくる⇒だがしかし、toStringの結果が巨大なテキストの場合、その直後にStringの中身を1文字づつコード変換(知らない文字を?に変える簡単なお仕事=getByte(“UTF-8”)等)がかかるのは明らかで、いくら苦労してもメモリ云々以前に処理が遅すぎるんだよね。というオチ。
それでも、単に文字列を結合するならStringBuiderでも構わないけど、後になって<BR>や¥n(改行コード)をデリミタとして差し込むとか言い出されることは多い。
そうなると、if(StringBuider.IsNotEmpty()) { StringBuider.append(デリミタ); } を全般に挿入することになる
さらに始末が悪いのが・・・
最初はサンプルHTMLのJavaScriptのInnerHTMLで差し込むのでバリバリに<BR>であったが、
後になってJSPタグで差し込むことになると、<BR>を¥n(改行コード)に一斉置換しなければいけない。
しかし、全ソースの<BR>を対象にする訳にはいかない。しかも<BR>とか¥nなんてソースに直書きしないのがお約束だから、猶更始末に負えない。
これはかなりの重労働になりそう。
そんな優柔不断な相手にはListに詰め込み最後にJoinすれば安心だろう。
と思ったので書いてみた。
そして、StringBuiderに joinがあったらとは云わない、でも、せめてtoArrayダケでもあったら良かったのに・・・とも思った。(かなり真剣に




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA