使用并行流从java列表中获取Pojo,而不使用任何类型的索引
我有一个Java列表,如下所示:使用并行流从java列表中获取Pojo,而不使用任何类型的索引,java,list,parallel-processing,java-stream,Java,List,Parallel Processing,Java Stream,我有一个Java列表,如下所示: FileService fileService = new FileService("testi"); List<FilePojo> list = fileService.getAllFiles(); Stream.of(list).parallel().forEach(filePojo -> { System.out.println(filePojo); } }); 然后我偶然发现了Stream a
FileService fileService = new FileService("testi");
List<FilePojo> list = fileService.getAllFiles();
Stream.of(list).parallel().forEach(filePojo -> {
System.out.println(filePojo);
}
});
然后我偶然发现了Stream api,并尝试按如下方式重构代码:
FileService fileService = new FileService("testi");
List<FilePojo> list = fileService.getAllFiles();
Stream.of(list).parallel().forEach(filePojo -> {
System.out.println(filePojo);
}
});
使用此方法,我无法从filePojo访问getter(与第一个方法不同),尽管我可以看到如下对象:
for (FilePojo filePojo : list){
System.out.println(filePojo.getId()+" "+filePojo.getName());
}
[pojo.FilePojo@56528192, pojo.FilePojo@6e0dec4a, pojo.FilePojo@96def03, pojo.FilePojo@5ccddd20, pojo.FilePojo@1ed1993a, pojo.FilePojo@1f3f4916, pojo.FilePojo@794cb805, pojo.FilePojo@4b5a5ed1]
Stream.of(list).parallel().forEach(filePojo -> {
for (int i = 0; i < list.size(); i++) {
System.out.println("=============================\n" + "Element at " + i + "\n" + filePojo.get(i).getId() + "\n" + filePojo.get(i).getCustomerId() + "\n" + filePojo.get(i).getFileName() + "\n ========================");
}
});
如果使用如下索引,我可以访问getter:
for (FilePojo filePojo : list){
System.out.println(filePojo.getId()+" "+filePojo.getName());
}
[pojo.FilePojo@56528192, pojo.FilePojo@6e0dec4a, pojo.FilePojo@96def03, pojo.FilePojo@5ccddd20, pojo.FilePojo@1ed1993a, pojo.FilePojo@1f3f4916, pojo.FilePojo@794cb805, pojo.FilePojo@4b5a5ed1]
Stream.of(list).parallel().forEach(filePojo -> {
for (int i = 0; i < list.size(); i++) {
System.out.println("=============================\n" + "Element at " + i + "\n" + filePojo.get(i).getId() + "\n" + filePojo.get(i).getCustomerId() + "\n" + filePojo.get(i).getFileName() + "\n ========================");
}
});
Stream.of(list).parallel().forEach(filePojo->{
对于(int i=0;i
是否可以从列表流中获取Pojo而不使用索引(类似于第一种方法)?或者我需要借助索引来解决这个问题吗?您以错误的方式使用Stream.of()方法,您创建的是列表流,而不是其中的对象流
试试这个:
list.stream()
.parallel()
.forEach(filePojo -> System.out.println(filePojo.getId() + " " + filePojo.getName()));
您可以通过以下方式使用流执行此操作:
list.stream() // Stream<FilePojo>
.map(filePojo -> filePojo.getId() + " " + filePojo.getName())
.forEach(System.out::println);
进一步阅读:当然,您可以创建一个“流”,映射它,然后打印:
list.stream()
.map(filePojo -> filePojo.getId() + " " + filePojo.getName())
.forEach(e -> System.out.println(e));
Stream.of(list)
读作“创建列表流”,但您需要的是“在列表中创建元素流”,因此上面的list.Stream
此外,不要不小心调用Stream.of(list).parallel()当您不确定是否可以从并行处理中获益时,它可能会以比顺序方法更差的性能再次困扰您
但在现实中,如果您只需要上述内容,则不需要这样做,只需继续您的方法或执行以下操作:
list.forEach(f -> System.out.println(f.getId()+" "+f.getName()));
因为列表有forEach方法。您在FilePojo中实现了toString()吗?当您实现toString()时,它将填充对象的值。您是否阅读了Stream.of()方法的文档?
forEach
缺少一个print语句?不过我会避免最后一个建议,您的第一个建议是我建议的。@Aomine True,但这只是为了向OP澄清它们在代码中的最终结果。