2016-07-12 3 views
0

以前のフィルタ結果に基づいてストリーム検索を簡単にする方法はありますか?以前のフィルタ結果に基づいてストリーム検索を簡素化する方法はありますか?

HashMap<Boolean, List<Path>> result = (HashMap<Boolean, List<Path>>) Files.walk(Paths.get(folder)).map(Path 
      ::toAbsolutePath).collect(Collectors.groupingBy(Files::isSymbolicLink)); 
    result.get(true).stream().filter(path -> { 
     try { 
      return !result.get(false).contains(Files.readSymbolicLink(path)); 
     } catch (IOException e) { 
      throw Throwables.propagate(e); 
     } 
    }).forEach(symbolicLink -> { 
     try { 
      result.get(false).addAll(Files.walk(symbolicLink, FileVisitOption.FOLLOW_LINKS).collect(Collectors 
        .toList())); 
     } catch (IOException e) { 
      throw Throwables.propagate(e); 
     } 
    }); 

    return result.get(false).stream().filter(Files::isRegularFile).distinct().collect(Collectors.toList()); 

答えて

1

あなたは、メソッドにコードの一部を抽出してとHashMapの使用を避けることによってそれを片付けることができます。

HashMapの代わりに、ファイルをSet<Path>に保存することができます。これにより、一意性が強制されるため、シンボリックリンクが既に存在するファイルにつながっているかどうかを確認する必要はなく、フィルタリングの一部を削除できます。

関連する問題