54

Java-8 では、またはメソッドを使用して、 String(または任意のCharSequence) を として簡単に扱うことができます。IntStreamcharscodePoints

IntStream chars = "Hello world.".codePoints();

その後、ストリームの内容を操作できます

IntStream stars = chars.map(c -> c == ' ' ? ' ': '*');

結果をきちんと印刷する方法を探していましたが、簡単な方法さえ見つけられませんでした。intこのs のストリームを、 String.

以上starsより印刷希望

***** ******
4

10 に答える 10

50
String result = "Hello world."
  .codePoints()
//.parallel()  // uncomment this line for large strings
  .map(c -> c == ' ' ? ' ': '*')
  .collect(StringBuilder::new,
           StringBuilder::appendCodePoint, StringBuilder::append)
  .toString();

しかし、それでも、"Hello world.".replaceAll("[^ ]", "*")より単純です。すべてがラムダの恩恵を受けるわけではありません。

于 2013-11-28T14:39:30.233 に答える
25

Holger のソリューションは少し効率が悪いですが、より簡潔です。

String result = "Hello world."
    .codePoints()
    .mapToObj(c -> c == ' ' ? " ": "*")
    .collect(Collectors.joining());

Collectors.joining()StringBuilder少なくともOpenJDK ソースでは内部的に使用します。

于 2014-05-09T12:15:24.023 に答える
1

ストリーミングですべてを行う傾向がやや少ない単純な答えがあります。したがって、これはワンライナーではありませんが、おそらくより効率的で非常に読みやすいです。

public static String stars(String t) {
    StringBuilder sb = new StringBuilder(t.length());
    t.codePoints().map(c -> c == ' ' ? ' ' : '*').forEach(sb::appendCodePoint);
    return sb.toString();
}

短いと簡潔ではない場合もありますが、上記の関数がどのように動作するのか疑問に思う人はいないと思います。

このソリューションにより、コード ポイントが文字に変換されないことが保証されます。したがって、ここにリストされている他のソリューションよりもやや一般的です。

于 2016-11-21T23:21:45.640 に答える
1

必要に応じて、この非常に醜い方法でワンライナーを作成できます。

public static String stars(String t) {
    return t.codePoints().map(c -> c == ' ' ? ' ': '*').mapToObj(i -> new String(new int[] { i }, 0, 1)).collect(Collectors.joining());
}

他の回答とまったく同じバージョンを実行しますが、ストリーミングをずっと使用しています。単一のコード ポイントを文字列に変換する関数が明らかに必要です。

public static String stars(String t) {
    return t.codePoints().map(c -> c == ' ' ? ' ': '*').mapToObj(Stars::codePointToString).collect(Collectors.joining());
}

private static String codePointToString(int codePoint) {
    return new String(new int[] { codePoint }, 0, 1);
}

Starsもちろん、これらの関数をクラスに配置します。

于 2016-11-21T23:36:54.710 に答える
0

次のコードで直接行うことができます:-

"Hello world".codePoints().forEach(n -> System.out.print(n == ' ' ? ' ':'*'));
于 2016-04-18T09:15:16.477 に答える