如何使用Stream API和Printwriter写入文件时避免使用上一个新行?

Kor*_*gay 3 java lambda java-8 java-stream

我正在研究Java 8附带的Lambdas和Stream API.我想使用Stream API创建一个类似于此类的文件,仅用于练习目的:

b
bb
bbb
bbbb
bbbbb
bbbb
bbb
bb
b
Run Code Online (Sandbox Code Playgroud)

这是我提出的实现:

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();
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题是,我最终在文件中留下了一个空的最后一行,因为printwriter正在用新行打印最后一个'b'.

显然我可以通过4而不是5第二次IntStream.iterate我已经冲洗了printWriter我能做的事情:printWriter.print("b");但我的目标是利用Stream API.

我怎样才能实现更多Streamy

Hol*_*ger 7

你可以更简单地工作

Files.write(Paths.get("/Users/kt/sample.data"),
    () -> IntStream.range(1, 10)
        .<CharSequence>mapToObj(i -> "bbbbb".substring(Math.abs(5-i)))
        .iterator());
Run Code Online (Sandbox Code Playgroud)

不说了

Files.write(Paths.get("C:\\Users\\pietsch\\AppData\\Local\\Temp\\output"),
    Collections.singletonList("b\nbb\nbbb\nbbbb\nbbbbb\nbbbb\nbbb\nbb\nb"));
Run Code Online (Sandbox Code Playgroud)

如果由于硬编码不变量而感觉太像欺骗,请更改代码以允许指定任意最大字符串大小:

int size = 5;

int[] codepoints = IntStream.range(0, size).map(i -> 'b').toArray();
Files.write(Paths.get("/Users/kt/sample.data"),
    () -> IntStream.range(1, size*2)
        .<CharSequence>mapToObj(i -> new String(codepoints, 0, size-Math.abs(size-i)))
        .iterator());
Run Code Online (Sandbox Code Playgroud)