Google Collections Distinct Predicate

时间:2010-10-27 18:14:56

标签: java guava

如何使用Google Collections Collections2.filter方法实现不同的谓词?

2 个答案:

答案 0 :(得分:9)

如果我理解正确,我不确定Predicate是否是正确的解决方案:

创建这样的谓词需要维护某种状态(即:维护已经看过的一组事物)。在javadoc中明确建议这样做。

获取集合中不同项目的常用方法是将它们全部添加到集合中。即:

Set<T> uniqueItems = Sets.newHashSet(collectionWithPotentialDuplicates);

如果<T>上的equals()和hashCode()方法没有按照你想要的方式定义唯一性,那么你应该编写一个在Collection<T>和{{1}上运行的实用程序方法}}返回Function<T, Object>类型的项目,这些项目在使用T转换后是唯一的

答案 1 :(得分:0)

我的解决方案:

// Create unique list
final Set<String> unique = new HashSet<String>(FluentIterable
                                                .from(sourceList)
                                                .transform(new Function<T, String>() {
                                                    @Override
                                                    public String apply(T input) {
                                                        // Here we create unique entry
                                                        return input.toString(); 
                                                    }
                                                }).toSet());
// Filter and remove duplicates
return FluentIterable
        .from(prePscRowList)
        .filter(new Predicate<T>() {
            @Override
            public boolean apply(T input) {
                boolean exist = false;
                if(unique.contains(input.toString())){
                    unique.remove(input.toString());
                    exist = true;
                }
                return exist;
            }
        }).toList();