我有一个Java列表,如下所示:
FileService fileService = new FileService("testi");
List<FilePojo> list = fileService.getAllFiles();
我想做的是遍历列表,从中获取FilePojo
对象并打印某些属性。我可以通过执行以下操作来实现:
for (FilePojo filePojo : list){
System.out.println(filePojo.getId()+" "+filePojo.getName());
}
然后我偶然发现了Stream api,并尝试如下重构我的代码:
Stream.of(list).parallel().forEach(filePojo -> {
System.out.println(filePojo);
}
});
使用此方法,我无法从filePojo访问getter(与第一种方法不同),尽管我可以看到如下所示的对象:
[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 ========================");
}
});
是否可以在不使用索引的情况下从列表流中获取Pojo(类似于第一种方法)?还是我需要借助索引来解决此问题?
答案 0 :(得分:1)
您以错误的方式使用Stream.of()方法,正在创建列表流,而不是其中的对象流。
尝试这个:
list.stream()
.parallel()
.forEach(filePojo -> System.out.println(filePojo.getId() + " " + filePojo.getName()));
答案 1 :(得分:1)
您可以使用以下流来实现它:
list.stream() // Stream<FilePojo>
.map(filePojo -> filePojo.getId() + " " + filePojo.getName())
.forEach(System.out::println);
使用Stream.of
,您将不得不flatMap
流,因为最终创建的是Stream<List<FilePojo>>
Stream.of(list) // Stream<List<FilePojo>>
.flatMap(List::stream) // Stream<FilePojo>
.map(filePojo -> filePojo.getId() + " " + filePojo.getName())
.forEach(System.out::println);
答案 2 :(得分:1)
当然,您可以创建一个“流”,将其映射然后打印:
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
方法。