述語はこれらのパラメータを保持する必要があり、ユーザーはこれらの述語を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());
}}
ありがとうございます提供されました。感謝し、考慮される:) – draft