StringをStream of Stringsに分割するには?
質問
にはどのようなものがありますか? ベスト String を Stream に分割する方法は何ですか?
私はこれらのバリエーションを見ました。
-
Arrays.stream("b,l,a".split(","))
-
Stream.of("b,l,a".split(","))
-
Pattern.compile(",").splitAsStream("b,l,a")
私の優先順位は
- 堅牢性
- 可読性
- パフォーマンス
完全でコンパイル可能な 例 :
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class HelloWorld {
public static void main(String[] args) {
stream1().forEach(System.out::println);
stream2().forEach(System.out::println);
stream3().forEach(System.out::println);
}
private static Stream<String> stream1() {
return Arrays.stream("b,l,a".split(","));
}
private static Stream<String> stream2() {
return Stream.of("b,l,a".split(","));
}
private static Stream<String> stream3() {
return Pattern.compile(",").splitAsStream("b,l,a");
}
}
どのように解決するのですか?
Arrays.stream
/
String.split
以来
String.split
は配列を返します。
String[]
私はいつも
Arrays.stream
を推奨しています。
String input = "dog,cat,bird";
Stream<String> stream = Arrays.stream(input.split( "," ));
stream.forEach(System.out::println);
Stream.of
/
String.split
Stream.of
は
ヴァーラグ
これは、varargs メソッドが配列を介して実装されており、varargs が Java に導入され、既存のメソッドが変数の引数を受け入れるように改修されたときに互換性の懸念があったためです。
Stream<String> stream = Stream.of(input.split(",")); // works, but is non-idiomatic
Stream<String> stream = Stream.of("dog", "cat", "bird"); // intended use case
Pattern.splitAsStream
Pattern.compile(",").splitAsStream(string)
は、中間配列を作成するのではなく、直接ストリーミングを行うという利点があります。そのため、多数の部分文字列の場合、これはパフォーマンス上の利点があります。一方、区切り文字が些細なもの、つまり単一のリテラル文字である場合は
String.split
の実装は、正規表現エンジンを使う代わりに高速なパスを通ることになります。つまり、この場合、答えは些細なことではありません。
Stream<String> stream = Pattern.compile(",").splitAsStream(input);
ストリーミングが別のストリームの内部で行われる場合、例えば
.flatMap(Pattern.compile(pattern) ::splitAsStream)
のような別のストリームの内部で起こる場合、パターンを分析する必要があるのは一度だけで、外側のストリームのすべての文字列についてではない、という利点があります。
Stream<String> stream = Stream.of("a,b", "c,d,e", "f", "g,h,i,j")
.flatMap(Pattern.compile(",")::splitAsStream);
という形式のメソッド参照のプロパティです。
expression::name
で説明されているように、機能インターフェースのインスタンスを作成するときに式を評価し、その結果を取り込みます。
System.out::println に相当するラムダ式は何ですか?
と
java.lang.NullPointerException がメソッド参照を使用してスローされますが、ラムダ式はスローされません。
関連
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み] Bashで文字列を配列に分割する方法は?
-
[解決済み] 文字列を複数の単語境界のデリミタで単語に分割する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
強制型変換について
-
Java:未解決コンパイル問題の解決方法
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
Zipファイルの圧縮・解凍にantを使用する
-
ApiModel と @ApiModelProperty の使用法
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。