2016-09-20 56 views
2

爪哇8流的多個文件flatmap到給定文件名的陣列線

bigList = Arrays.stream(files) 
       .flatMap(file -> { 
        try { 
         return Files.lines(Paths.get(path + SEPARATOR + file)); 
        } catch (IOException e) { 
         LOGGER.log(Level.WARNING, "No se puede encontrar el archivo " + file); 
        } 
        return null; 
       }) 
       .filter(str -> str.startsWith("ABC")) 
       .distinct() 
       .map(Mapper::mapToObj) 
       .collect(Collectors.toList()); 

這被返回時我使用一個傳統的for循環(而不是Arrays.stream(..)不同的輸出flatMap (..))

for(String file : files) { 
     bigList.addAll(Files.lines(Paths.get(path + SEPARATOR + file)) 
       .filter(str -> str.startsWith("ABC")) 
       .distinct() 
       .map(Mapper::mapToObj) 
       .collect(Collectors.toList())); 
    } 

爲什麼會發生這種情況?

在此先感謝

乾杯

+0

樣本輸入和輸出? –

+0

@BoristheSpider你說得對,我修好了。 – delpo

+4

它返回不同的輸出,還是以不同的順序輸出相同的輸出? –

回答

6

這是因爲調用distinct()的。

當您撥打flatmap時,它將所有文件中的所有行合併爲一個Stream<String>,因此distinct()將返回所有文件中不同的行。

當您使用for循環時,您只能分別在每個文件的行上調用distinct()。所以,當你將它們添加到你的列表中時,如果同一行存在於不同的文件中,仍然可能有重複。

+0

這就是問題所在。謝謝。 – delpo

+3

不客氣,順便說一句,謝謝編輯@Andrew Mairose。 –