gpt4 book ai didi

java - 谓词泛型方法

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

我编写了一个 Predicate 代码,它接受任何 Object 并测试它是否满足以下条件:

  1. 如果Object类型是String并且包含“k”那么它应该返回true。
  2. 如果Object类型为Integer并且大于100那么它应该返回true。
  3. 如果Object类型是Employee,它是类并且员工的工资大于60000,它应该返回true。

编写该 Predicate 方法后,我编写了 remove 方法,该方法根据 Predicate 方法从列表中删除值。

public class ConditionalRemove {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(Arrays.asList("ramesh", "kushal", "suresh", "kc"));
System.out.println(conditionalRemove(list));
}

public static <T> List<T> conditionalRemove(ArrayList<T> list) {
ConditionCheck<T> cond = new ConditionCheck<>();
for (T t : list) {
if (cond.test(t)) {
list.remove(t);
}
}
return list;
}

static class ConditionCheck<T> implements Predicate<T> {
@Override
public boolean test(T t) {
if (t instanceof String) {
return (((String) t).contains("k"));
} else if (t instanceof Integer) {
return ((int) t > 100);
} else if (t instanceof Employee) {
return ((int) ((Employee) t).getSalary() < 60000);
}
return true;
}
}
}

编译此代码后,我发现线程“main”java.util.ConcurrentModificationException中出现异常

最佳答案

问题是您在迭代列表时正在更新列表。可以通过将代码更新为

来解决该问题
public static <T> List<T> conditionalRemove(ArrayList<T> list) {
ConditionCheck<T> cond = new ConditionCheck<>();
Iterator it = list.iterator();
while(it.hasNext())
{
it.next();
if (cond.test(t)) {
it.remove();
}
}
return list;
}

关于java - 谓词泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40250548/

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