如果我想并行处理此代码:
try {
for (int i = 0; i < 10000; i++) {
new File(String.valueOf(i)).createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
然后将其重写为:
ArrayList<String> fileNames = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
fileNames.add(String.valueOf(i));
}
fileNames.parallelStream().forEach(i -> new File(i).createNewFile());
但是有没有更好(更简单)的方法呢?
答案 0 :(得分:3)
一个独特的非答案:
如果我想并行处理此代码:
然后(很可能)您需要转向完全不同的硬件/软件堆栈,以从中获得任何好处。
您会看到,除非我们在谈论某种“远程”文件系统,否则可以通过多个“路径”(实际上是被)访问该文件系统,并且该文件系统实际上类似于多个IO设备。 ..您进行优化的尝试毫无意义。
并行处理包括很多正在等待的不同事情的活动是有意义的。但就您而言,您的代码使用一个文件系统与一个操作系统进行对话。最有可能的是,您的想法甚至使事情变慢了。
答案 1 :(得分:1)
在IntStream
中尝试parallel()
:
IntStream.range(0, 10000).parallel().forEach(i -> {
try {
new File(String.valueOf(i)).createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
});
但是由于磁盘操作,效率不会很高。
答案 2 :(得分:0)
只是为了另一种可能性。
fileNames.parallelStream().map(Path::Files.createFile).collect(Collectors.toList());
fileNames.stream().map(path -> Files.createFile(path)).collect(...
weenween返回一个列表,其中包含对象Path。