【问题标题】:Android List filterAndroid 列表过滤器
【发布时间】:2013-01-25 13:49:29
【问题描述】:

我有一个文件对象列表,我想根据类型(音频、视频、照片)或捕获日期/时间或 Exif 信息(如果是照片)等规则进行过滤。例如,我可以用一些 for cicles 来做到这一点。

有一个聪明的方法吗?我在某处读到解决方案可能是使用 Google Guava 的谓词,但我不明白它是如何工作的。有什么建议吗?谢谢

【问题讨论】:

    标签: android list filtering guava predicates


    【解决方案1】:

    使用 Guava 谓词你可以做一些事情

    import java.io.File;
    import java.util.Collection;
    import java.util.List;
    
    import javax.annotation.Nullable;
    
    import com.google.common.base.Predicate;
    import com.google.common.collect.Collections2;
    import com.google.common.io.Files;
    
    public class FileFiltering {
    
        public static void main(String[] args) {
            List<File> files = getFiles();
            Collection<File> audioFiles = Collections2.filter(files,
                    new AudioPredicate());
    
            Collection<File> videoFiles = Collections2.filter(files,
                    new VideoPredicate());
        }
    
        private static List<File> getFiles() {
            // TODO Auto-generated method stub
            return null;
        }
    }
    
    class AudioPredicate implements Predicate<File> {
    
        @Override
        public boolean apply(@Nullable File file) {
            return Files.getFileExtension(file.getName()).equalsIgnoreCase("mp3");
        }
    }
    
    class VideoPredicate implements Predicate<File> {
    
        @Override
        public boolean apply(@Nullable File file) {
            return Files.getFileExtension(file.getName()).equalsIgnoreCase("mkv");
        }
    }
    

    在应用方法中,您需要编写代码,为您想要的文件类型返回 true。

    【讨论】:

    • 感谢您的回答,如何同时组合多个谓词?
    • com.google.common.base.Predicates 允许将多个谓词与orand 结合起来。
    • 我在两个谓词上都遇到了这个错误:java.lang.NoClassDefFoundError:
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多