Java 使用流API和Printwriter写入文件时,如何避免中的最后一行新行?

Java 使用流API和Printwriter写入文件时,如何避免中的最后一行新行?,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我正在研究Java8附带的Lambdas和流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 -&

我正在研究Java8附带的Lambdas和流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。迭代
我拥有的,在刷新
printWriter
之前,我可以做:
printWriter.print(“b”),但我的目标是利用流API


我如何才能更流畅地实现这一点

我建议使用变量来存储大小,因为有几个地方需要它:
maxSize


  • 您可以使用返回行连接元素,然后使用
    print
    ,作为提示,您可以通过
    map
    操作简化
    StringBuilder
    的使用
  • 第二个选项是避免使用
    字符串
    变量,它是在每个块之间添加一个
    \n
    ,然后限制删除最后一个并全部打印,但这并不是两个块之间更有效的方法:

  • 我不知道流线型道路到底意味着什么,但是这个呢:

        int[] arr = new int[max * 2 - 1];
        arr[(max * 2) / 2] = max;
    
        IntStream.range(0, max)
                 .forEachOrdered(x -> {
                     arr[x] = x + 1;
                     arr[x + max - 1] = max - x;
                 });
    
        String result = Arrays.stream(arr)
                              .mapToObj(x -> IntStream.range(0, x)
                                                      .mapToObj(i -> "b")
                                                      .collect(Collectors.joining()))
                              .collect(Collectors.joining("\n"));
    

    你可以尽可能简单地完成你的工作

    Files.write(Paths.get("/Users/kt/sample.data"),
        () -> IntStream.range(1, 10)
            .<CharSequence>mapToObj(i -> "bbbbb".substring(Math.abs(5-i)))
            .iterator());
    
    如果由于硬编码不变量而感觉太像作弊,请更改代码以允许指定任意最大字符串大小:

    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());
    
    int size=5;
    int[]codepoints=IntStream.range(0,size).map(i->'b').toArray();
    Files.write(path.get(“/Users/kt/sample.data”),
    ()->IntStream.range(1,大小*2)
    .mapToObj(i->新字符串(codepoints,0,size-Math.abs(size-i)))
    .iterator());
    
    您不需要临时数组来模拟先升后降的函数。此外,还有一些更简单的方法可以为给定长度创建一个相等字符的字符串(甚至不用说Java 11的
    “b”。重复(x)
    )…我自己编的单词
    Streamy
    ,我也不知道它的意思。。但我听到人们说
    Springy
    Pythonic
    ,所以我的目标是针对这些术语,并有类似的东西。@霍尔格你说得对,我只知道番石榴中的
    Strings::repeat
    ,这是一种创建相等字符字符串的非常短的方法。。。我只知道有一种方法可以通过
    Math::abs
    来实现,但最终无法解决;你的答案更好,同意。投票赞成最后一个建议,硬编码的解决方案部分并没有真正的帮助。我还不如打开一个文本文件并在那里键入,然后通过复制粘贴将其传递给PrintWriter。。真的没有尽头。那么我也不需要
    单例列表
    。它说明了精确任务定义的重要性。在这里,似乎很自然地将大小作为任务的一个参数。但是还有很多硬编码的属性。例如,支持不同于
    b
    的字符怎么样?还是一个不同的增量?您总是可以使解决方案更通用,但可能会浪费大量时间用于您不需要的事情(对比)。这就是为什么在不需要更多变通能力的情况下,一个感觉像作弊的解决方案可能是合适的。
    Files.write(Paths.get("/Users/kt/sample.data"),
        () -> IntStream.range(1, 10)
            .<CharSequence>mapToObj(i -> "bbbbb".substring(Math.abs(5-i)))
            .iterator());
    
    Files.write(Paths.get("C:\\Users\\pietsch\\AppData\\Local\\Temp\\output"),
        Collections.singletonList("b\nbb\nbbb\nbbbb\nbbbbb\nbbbb\nbbb\nbb\nb"));
    
    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());