gpt4 book ai didi

java - 在Java8中,如何确保不使用重复转换?

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

我在Java中有以下过滤功能:

public static <T> void filter(List<T> items, Predicate condition)
{
System.out.print("\t");
for(T element : items)
{
if (condition.test(element))
{
System.out.print(element + " ");
}
}
System.out.println("");
}

我尝试将其称为:

List <String> cities = Arrays.asList("Chennai", "New Delhi", 
"Mumbai", "Pune", "Madurai", "Bhopal", "Bilaspur");
filter(cities, (String str)->str.startsWith("B") ||
str.startsWith("C") ||str.startsWith("M"));

但是,我收到以下错误,指向String str:

incompatible parameter types in lambda expression

如果我删除 strString 前缀,那么我必须将条件链中出现的每个 str 更改为 ((String) str).startsWith("B") || ...这无疑是非常冗长的。

最佳答案

发生这种情况是因为您正在使用参数化类 Predicate作为原始类,而不是利用泛型。你应该改变PredicatePredicate<T> ,然后您的代码将起作用,您可以删除 String前缀。

Predicate本质上就像 Predicate<Object> ,所以你的filter()方法期望第二个参数是在 Object 上运行的谓词s。但是,您正在尝试传递 Predicate<String>反而。自Predicate<String>不是Predicate<Object> ,你会收到编译错误。

将参数更改为 Predicate<T> 后,您的 lambda 表达式不再需要显式地说 String str ,因为只需输入 str它将自动评估为 Predicate<String>使用类型推断。

关于java - 在Java8中,如何确保不使用重复转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61847003/

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