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

时间:2018-12-03 12:19:38

标签: java list parallel-processing java-stream

我有一个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(类似于第一种方法)?还是我需要借助索引来解决此问题?

3 个答案:

答案 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);

进一步阅读Should I always use a parallel stream when possible?

答案 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方法。