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

Java 类型列表中的方法transform()不适用,java,guava,Java,Guava,我试图使用番石榴函数从列表中删除重复项。其原因是,重复是基于列表中两个项目之间的比较,而这些对象是否重复需要相当多的逻辑 以下是我对该函数的尝试: private Function<List<BaseRecord>, List<BaseRecord>> removeDuplicates = new Function<List<BaseRecord>, List<BaseRecord>>() { p

我试图使用番石榴函数从列表中删除重复项。其原因是,重复是基于列表中两个项目之间的比较,而这些对象是否重复需要相当多的逻辑

以下是我对该函数的尝试:

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;
    }

};
然后我试着用list.transformoriginalRecords,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的父类,而不是子类

我刚才犯了一个愚蠢的错误吗?

Lists.transform不是用于转换列表,而是用于转换列表的元素。您可以尝试将原始记录包装到另一个列表中,但这似乎不是一个很好的解决方案


但是,也许您可以将函数重构为谓词并使用Collections2.filter

看起来这里根本不需要番石榴,除了newArrayList:

…然后只需调用重复数据记录,而无需执行任何函数。

原因是- 您正在使用包中的函数 java.blah-blah.function.function。 但是番石榴想要这里

import com.google.common.base.Function;

不幸的是,检查重复项的一部分需要获取下一个元素,然后比较这两个项目。谓词只接受一个参数并返回一个布尔值。您可以使用列表作为其成员初始化谓词,因此它将具有访问权限。看起来也没有必要使用谓词。我看不出番石榴能做什么来改进直接方法。是的,但是删除重复项只是过滤列表的几个步骤中的第一步。我希望通过简单地使用一个包含多个list.transform调用的函数来清理现有代码。听起来你应该只使用一个包含几个完全正常的函数调用的函数。您还没有展示任何示例,其中Lists.transform实际上会提供帮助。Lists.transform接受一个列表和一个函数,并返回一个列表。你所描述的没有一个是那样的。
import com.google.common.base.Function;