gpt4 book ai didi

java - 如何使用谓词函数过滤 Java 中的列表?

转载 作者:行者123 更新时间:2023-12-01 06:58:01 25 4
gpt4 key购买 nike

考虑以下代码:

ICondition searchCondition, scopeCondition...
List<ICondition> filtered = CollectionUtil.filter(
Arrays.asList(searchCondition, scopeCondition),
CollectionUtil.isNonNull);

编译失败:

"The method filter(Collection<T>, CollectionUtil.Predicate<T>) in the type CollectionUtil is not applicable for the arguments (List<ICondition>, CollectionUtil.Predicate<Object>)"

如果我定义 ICondition 一切都很好-具体isNonNull()谓词,但这很愚蠢,我不明白出了什么问题或如何修复它。

这是我的实用函数:

public interface Predicate<T> 
{
boolean apply(T type);
}

public static <T> List<T> filter(Collection<T> target, Predicate<T> predicate)
{
target = Collections.unmodifiableCollection(target);
List<T> result = new ArrayList<T>();
for (T element: target) {
if (predicate.apply(element)) {
result.add(element);
}
}
return result;
}


// This predicate works as expected.
public static CollectionUtil.Predicate<String> isStringNonBlank = new CollectionUtil.Predicate<String>() {
public boolean apply (String item) {
return !StringUtils.isBlank(item);
}
};

// This predicate looks fine, but fails in usage.
public static CollectionUtil.Predicate<Object> isNonNull = new CollectionUtil.Predicate<Object>() {
public boolean apply (Object item) {
return null != item;
}
};

为什么我不能将第二个谓词与 filter() 一起使用?

最佳答案

看起来您的 filter 函数的 predicate 参数没有正确逆变。尝试按如下方式重写:

public static <T> List<T> filter(Collection<? extends T> source,
Predicate<? super T> predicate)
{
final List<T> result = new ArrayList<T>(source.size());
for (T element: source)
if (predicate.apply(element))
result.add(element);
return result;
}

这就是说,只要谓词函数愿意接受不小于 T 类型的类型,就可以使用 T< 类型的实例来调用它 (或从 T 进一步派生的某种类型)可以正常工作。

关于java - 如何使用谓词函数过滤 Java 中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6638338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com