2016-04-23 5 views
6

私はすでにthis関連の記事を読んでいます。ストリング操作に関しては、ストリームは膨大な量の儀式を引き付けるようです。文字列を文字列として解析したい場合は、最初にIntStreamに変換してObjectにマップし、intcharにキャストし、最終的にcharStringにキャストし、それを返す。Java 8ストリームは、文字と文字列で使用されることはありませんか?

人々は、命令型プログラミングには式のオーバーヘッドがあると言います。私が完全に間違っていたら私を修正してください。私の意図は、Javaストリームをよく理解するためではなく、Javaストリームをより良く理解することです。

// Simple method which encrypts all chars in a string 
String input = "Hel!lo"; 

String result = input.chars()        // Need to convert into an IntStream 
     .mapToObj(e -> Character.toUpperCase((char) e))  // Need to map to Object (!) and then cast to char 
     .map(CryptoMath::encryptChar)      // Calling the encryption 
     .map(String::valueOf)        // Need to cast to String again... 
     .collect(joining(""));        // Finally done 

System.out.println(result); 
+1

単に 'char'を' int'として扱うことができます。しかし、この問題は実際にJavaのプリミティブ型の問題全体の遺産である。 –

+0

もし私がそれを行うなら、代わりにintを取るためにcharパラメータを使って各メソッドを変更する必要があります。これは私の意見ではコード臭です。プリミティブに関するどの問題を指していますか?リンクがありますか? – AdHominem

+1

ちょうどそれはGoogleです。プリミティブでジェネリックを使用することはできません。彼らは 'Stream '、 'IntSteam' **、**' LongStream'に同じコードを書く必要がありました。彼らは 'CharStream'を作成しないことを選択しました。これは近代的なJavaを後押しするアンカーです。切断可能なものではありません。 –

答えて

3

あなたはUnicodeコードポイントの代わりの文字を操作することができる場合、それは少し小さい面倒char上で動作よりも次のようになります。

String input = "Hel!lo"; 

String result = input.codePoints() 
        .map(Character::toUpperCase) 
        .collect(StringBuilder::new, 
           StringBuilder::appendCodePoint, 
           StringBuilder::append) 
        .toString(); 

System.out.println(result); 

必要なしボクシングはの時点では、文字列への変換は、ありません入力データのサロゲートペアによってトリップされる可能性は低くなります。より広範なインプットのために何かを実装するのが苦労しない良い機会の一つです。

+1

-1これは関連記事の示唆で、OPは既に読んでいて、満足のいく回答が見つからなかった。あなたは、他の郵便の提案を引用し、それがなぜOPに答えを出すのかを説明する必要があります。 –

+0

私は関連記事のコメントを気付いていたかもしれませんが、私の信用できないことに私はそれを見逃して見逃しました。私の防衛では、それは答えではなく小さなコメントであり、どれだけ簡単に使用できるかを明確にするコード例を提供していませんでした。あなたは決してわかりません。明確な例で上記のように設定すると、私とは違って、リンク先からのコメントを見て破棄​​したと仮定して、OPが「実際には、それは私のために働く」と言えるかもしれません。もしそうでなければ、彼は完全にそれを答えとして受け入れない自由です。 –

1

Eclipse Collectionsとすると、Java標準ライブラリで不足している部分を補うことができます。 CharAdapterを使用すると、CryptoMath.encryptChar()が返され、charと返されます。

String result = CharAdapter.adapt(input) 
     .collectChar(Character::toUpperCase) 
     .collectChar(CryptoMath::encryptChar) 
     .makeString(""); 

注:私はEclipse Collectionsのコミッターです。