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
と思ったので書いてみた。
そして、StringBuiderに joinがあったらとは云わない、でも、せめてtoArrayダケでもあったら良かったのに・・・とも思った。(かなり真剣に