类型列表中的方法transform()不适用

时间:2014-04-24 16:14:54

标签: java guava

我正在尝试使用Guava函数从List中删除重复项。这样做的原因是“复制”是基于列表中两个项目之间的比较,以及这些对象是否“重复”需要相当多的逻辑。

以下是我对该功能的尝试:

private Function<List<BaseRecord>, List<BaseRecord>> removeDuplicates = 
        new Function<List<BaseRecord>, List<BaseRecord>>() {

    public List<BaseRecord> apply(List<BaseRecord> records) {


        List<BaseRecord> out = Lists.newArrayList();


        PeekingIterator<BaseRecord> i = Iterators.peekingIterator(records.iterator());

        while (i.hasNext()) {
            BaseRecord current = i.next();

            boolean isDuplicate = false;

            if ( i.hasNext() ) {

                BaseRecord next = i.peek();


                // use a ComparisonChain to compare certain fields, removed
                isDuplicate = compareCertainObjects(o1, o2);

            }

            if ( !isDuplicate ) {
                out.add(current);
            }
        }


        return out;
    }

};

然后我尝试使用Lists.transform(originalRecords,removeDuplicates)调用它

不幸的是,Eclipse并不满意:

The method transform(List<F>, Function<? super F,? extends T>) in the type Lists is not applicable for the arguments (List<BaseRecord>, Function<List<BaseRecord>,List<BaseRecord>>).

BaseRecord是一个抽象类,至少有两个子类型。被比较的字段都是BaseRecord的父节点,而不是子类。

我只是犯了一个愚蠢的错误吗?

3 个答案:

答案 0 :(得分:4)

原因是 - 你正在使用包中的功能 java.blah-blah.function.Function。 但番石榴想要在这里

import com.google.common.base.Function;

答案 1 :(得分:2)

Lists.transform并非用于转换List,而是转换元素。您可以尝试将originalRecords包装到另一个列表中,但这似乎不是一个“漂亮”的解决方案。

但是,也许您可​​以将Function重构为Predicate并使用Collections2.filter

答案 2 :(得分:2)

除了newArrayList()之外,看起来Guava在这里看起来并不是必需的。

  List<BaseRecord> dedupe(List<BaseRecord> records) {
    List<BaseRecord> out = Lists.newArrayList();
    for (BaseRecord current : records) {
       boolean isDuplicate = false;
       for (BaseRecord other : out) {
         if (compareCertainObjects(current, other)) {
           isDuplicate = true;
           break;
         }
       }
       if (!isDuplicate) {
         out.add(current);
       }
     }
     return out;
  }

...然后只需致电dedupe(records),而无需通过Function