簡體   English   中英

使用並行流從Java列表中獲取Pojo,而無需使用任何類型的索引

[英]Get Pojo from a java list using parallel stream without using any kind of index

我有一個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]

如果使用這樣的索引,則可以訪問getter:

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(類似於第一種方法)? 還是我需要借助索引來解決此問題?

您以錯誤的方式使用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);

使用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);

進一步閱讀如果可能,是否應該始終使用並行流?

當然,您可以創建一個“流”,將其映射然后打印:

list.stream()
    .map(filePojo -> filePojo.getId() + " " + filePojo.getName())
    .forEach(e -> System.out.println(e));

Stream.of(list)讀為“創建列表流”,但是您想要的是“在列表中創建元素流”,因此list.stream上面的list.stream

此外,當您不確定是否可以從並行處理中受益時,請不要粗心地調用Stream.of(list).parallel() ,它可能會比順序方法帶來更差的性能。

但是實際上,如果您需要的只是上述內容,那么就不需要這樣做,只需繼續執行您的方法或執行以下操作:

list.forEach(f -> System.out.println(f.getId()+" "+f.getName()));

因為列表具有forEach方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM