Java 使用流API和Printwriter写入文件时,如何避免中的最后一行新行?
我正在研究Java8附带的Lambdas和流API。我想使用流API创建一个类似这样的文件,只是为了练习: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 -&
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());