次の例のようにsubstring(1)呼び出しを行うことなく、ストリームの要素を結合し、それぞれを "\ n"で区切って "\ n"で始まらないよりエレガントな方法はありますか?もちろんstream.reduceの後に先頭の文字を切り詰めるよりエレガントな方法はありますか?
List<String> strings = someList;
String rval = strings.stream()
.map(this::someOperation)
.reduce("", (p1, p2) -> p1 + "\n" + p2);
if(rval.length() > 0)
{
// trim off the leading "\n"
rval = rval.substring(1);
}
return rval;
}
それはあなたの問題を解決する使用
.collect(Collectors.joining("\n"))
を私は内部ループでそれを置き換えることができますが、それは明らかに機能可読性
それは単なる優雅さの問題ではありません。 '' ''はあなたのアキュムレータ関数のアイデンティティではないので、あなたのコードは '' reduce ''の契約に違反します。 '' + "\ n" + "a" 'は' 'a" 'と等しくありません。これを 'reduce'で正しく行うには、引数が1つのバージョン、' .reduce((a、b) - > a + "\ n" + b).orElse( "") 'を使うべきです。次に、 'substring'のステップが必要ないか、ストリームがパラレルの場合にランダムに表示される余分な" \ n "を持つリスクがあります。 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-T-java.util.function.BinaryOperator- – Misha
を回答として追加してください。それをupvote、それは重要です –