2017-11-11 7 views
2

私はクラスを実装しようとしていますが、その責任は正確なディレクトリのファイルを検索することです。クラスは、ユーザからのパラメータのリスト(拡張子、名前、サイズ、最終変更日など)を受け取り、これらのパラメータをすべて使用してディレクトリをフィルタリングします。これには、連鎖責任パターンを使用します。つまり、それぞれ異なるフィルタがあり、それぞれ正確なフィルタ操作を行います(すべての操作はJava Stream APIで行います)。 問題は次のとおりです。 ユーザーから取得したこれらのStringパラメータをすべて格納する場所で、このパック全体をフィルタで正しく渡すことができますか?File Filter Javaで検索

さらに、私が自分の仕事をコピーするために選択したアプローチに関するコメントやコメントがあり、より良いものがあれば非常に感謝します。

答えて

1

ますしないただ述語を作成し、あなたの方法は、これらのPredicate秒のListを受け入れることができるとあなたは、単一のものに線に沿って何かをそれらを減らすことができ、それらを渡し、どこにでも私にそれらを格納:ソリューションの

private <T> Predicate<T> reduced(List<Predicate<T>> nameAndExtension) { 
    return nameAndExtension 
      .stream() 
      .reduce(s -> true, 
        (left, right) -> left.and(right)); 
} 

private void test(List<Predicate<String>> nameAndExtension, List<Predicate<Long>> sizeAndDateAsLong) { 

    Predicate<String> first = reduced(nameAndExtension); 
    Predicate<Long> second = reduced(sizeAndDateAsLong); 

    // apply the above 

} 
0

述語はこれらのパラメータを保持する必要があり、ユーザーはこれらの述語をand(述語<>)または(述語<>)と組み合わせる必要があります。

解決策の1つは、FileFilterを実装してFile.listFiles(FileFilter)で呼び出す方法ですが、複数のFileFilterクラスを組み合わせることはできません。

より良い解決策は、このように述語を実装することです:

ExtensionPredicate.java:

public class ExtensionPredicate implements Predicate<File> { 

String extension; 

public ExtensionPredicate(String extension) { 
    this.extension = extension; 
} 

@Override 
public boolean test(File file) { 
    return file != null && file.getName().endsWith(extension); 
}} 

SizePredicate.java:

public class SizePredicate implements Predicate<File> { 

long min; 
long max; 

public SizePredicate(long min, long max) { 
    this.min = min; 
    this.max = max; 
} 

@Override 
public boolean test(File file) { 
    return file != null && file.length() >= min && file.length() < max; 
}} 

使用法:

public class PredicatesTest { 
@Before 
public void createFiles() throws Exception{ 
    File directory = new File(Paths.get("myStuff").toUri()); 
    directory.mkdirs(); 
    new File(directory.getPath(),"a.csv").createNewFile(); 
    new File(directory.getPath(),"b.txt").createNewFile(); 
} 

@After 
public void removeFiles() throws Exception{ 
    File directory = new File(Paths.get("myStuff").toUri()); 
    for (File f: directory.listFiles()){ 
     f.delete(); 
    } 
    directory.delete(); 
} 

@Test 
public void testBoth() throws Exception{ 
    List<File> result = Arrays.asList(new File(Paths.get("myStuff").toUri()).listFiles()) 
      .stream() 
      .filter(new ExtensionPredicate(".txt").and(new SizePredicate(0, 100))) 
      .collect(Collectors.toList()); 
    TestCase.assertEquals(1, result.size()); 


}} 
+0

ありがとうございます提供されました。感謝し、考慮される:) – draft