Koray旅団:
私は、Java 8.私は目的を行使するために、この使用してストリームAPIのようなファイルなものを作りたかったのですが付属していラムダとストリームAPIを勉強しています:
b
bb
bbb
bbbb
bbbbb
bbbb
bbb
bb
b
これは私が思い付いた実装です。
final File file = new File("/Users/kt/sample.data");
final PrintWriter printWriter = new PrintWriter(file);
Stream.concat(IntStream.iterate(1, i -> i + 1).limit(6).boxed(),
IntStream.iterate(5, i -> i - 1).limit(5).boxed())
.map(counter -> {
StringBuilder stringBuilder = new StringBuilder();
IntStream.range(1, counter).forEach(c -> stringBuilder.append("b"));
return stringBuilder.toString();
}).filter(s -> s.length() != 0).forEach(s -> printWriter.println(s));
printWriter.flush();
printWriter.close();
PrintWriterのは、新しい行と一緒に最後の「b」を印刷しているので、今、唯一の問題は、私は、ファイル内の空の最後の行で終わるされます。
もちろん、私は渡すことができます4
代わりに5
第二にIntStream.iterate
、私が持っているとフラッシュする前にprintWriter
、私が行うことができますprintWriter.print("b");
が、私の目標は、ストリームAPIを活用することです。
どのように私はこれ以上を達成することができストリーを?
azro:
それを必要とするいくつかの場所があるように私は、サイズを格納する変数を使用することをお勧めします。 maxSize
- あなたは戻りラインを使用して要素を結合することができ、その後
print
、先端として、あなたはあなたの使用簡素化することができますStringBuilder
してmap
操作を
int maxSize = 5;
String str =
IntStream.concat(IntStream.iterate(2, i -> i + 1).limit(maxSize),
IntStream.iterate(maxSize, i -> i - 1).limit(maxSize - 1))
.mapToObj(count -> IntStream.range(1, count).mapToObj(c -> "b").collect(Collectors.joining()))
.collect(Collectors.joining("\n"));
printWriter.print(str);
- 2番目のオプションは、避けるために、
String
変数を、追加されるだろう\n
、最後の1枚を取り外して、すべてを印刷する制限、各ブロックの間が、これは、両方の間に、より効率的ではありません。
int maxSize = 5;
IntStream.concat(IntStream.iterate(2, i -> i + 1).limit(maxSize),
IntStream.iterate(maxSize, i -> i - 1).limit(maxSize - 1))
.mapToObj(count -> IntStream.range(1, count).mapToObj(c -> "b").collect(Collectors.joining()))
.flatMap(b -> Stream.of(b, "\n"))
.limit((maxSize * 2 - 1) * 2 - 1)
.forEach(printWriter::print);