使用并行流从java列表中获取Pojo,而不使用任何类型的索引

使用并行流从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

我有一个Java列表,如下所示:

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澄清它们在代码中的最终结果。