我正在尝试使用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的父节点,而不是子类。
我只是犯了一个愚蠢的错误吗?
答案 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
。