FileCollection

昨日の続き、、ディレクトリを走査するもの、名前が良くないので、FileCollection と名付け
さらに、Predicate を走査ではさみたくなった。

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
 * ファイルコレクション.
 */
public final class FileCollection {
   private File file;
   private FileCollection(String path){
      file = new File(path);
   }
   /**
    * インスタンス取得.
    * @param path コレクションするファイルパス
    * @return FileCollection
    */
   public static FileCollection of(String path){
      return new FileCollection(path);
   }
   /**
    * @return file
    */
   public File getFile(){
      return file;
   }
   /**
    * 走査実行→コレクション取得.
    * @return List<File>
    */
   public List<File> scan(){
      return parse(file, new ArrayList<>());
   }
   /**
    * Predicate走査実行→コレクション取得.
    * @param p 検査するPredicate<File>
    * @return List<File>
    */
   public List<File> scan(Predicate<File> p){
      return parse(file, new ArrayList<>(), p);
   }
   /**
    * 走査 Consumer実行.
    * @param c Consumer
    */
   public void scan(Consumer<File> c){
      parse(file, c);
   }
   /**
    * Predicate走査 Consumer実行.
    * @param p 検査するPredicate<File>
    * @param c Consumer
    */
   public void scan(Predicate<File> p, Consumer<File> c){
      parse(file, p, c);
   }
   /**
    * Predicate検査一致の成否.
    * @param p 検査するPredicate<File>
    * @return true=1つ以上一致するものがある。false=一致するものが存在しない。
    */
   public boolean anyMatch(Predicate<File> p){
      return findmatch(file, p);
   }
   private List<File> parse(File file, List<File> list){
      list.add(file);
      if (file.isDirectory()){
         for(File f:file.listFiles()){
            parse(f, list);
         }
      }
      return list;
   }
   private void parse(File file, Consumer<File> c){
      c.accept(file);
      if (file.isDirectory()){
         for(File f:file.listFiles()){
            parse(f, c);
         }
      }
   }
   private List<File> parse(File file, List<File> list, Predicate<File> p){
      if (p.test(file)) list.add(file);
      if (file.isDirectory()){
         for(File f:file.listFiles()){
            parse(f, list, p);
         }
      }
      return list;
   }
   private void parse(File file, Predicate<File> p, Consumer<File> c){
      if (p.test(file)) c.accept(file);
      if (file.isDirectory()){
         for(File f:file.listFiles()){
            parse(f, p, c);
         }
      }
   }
   private boolean findmatch(File file, Predicate<File> p){
      if (p.test(file)) return true;
      if (file.isDirectory()){
         for(File f:file.listFiles()){
            if (findmatch(f, p)) return true;
         }
      }
      return false;
   }
}

Example : /var 配下、ls -R オプションのように全ての log ファイルを抜き出す。

FileCollection.of("/var").scan(p->p.getName().endsWith(".log"), f->{
   System.out.println(f.getAbsolutePath());
});

Example : /var 配下、1個でも "error" がつくファイル名が存在したら何かする

if (FileCollection.of("/var").anyMatch(f->f.getName().indexOf("error") >= 0)){
   // TODO
}