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?
你可以更简单地工作
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)