我的代码出了什么问题?
我想从List
list
中删除所有以 A 开头的元素:
public static void main(String[] args) {
Predicate<String> TTT = "A"::startsWith;
List<String> list = new ArrayList<>();
list.add("Magician");
list.add("Assistant");
System.out.println(list); // [Magician, Assistant]
list.removeIf(TTT);
System.out.println(list); // expected output: [Magician]
}
但是,removeIf
不会从列表中删除任何内容。
答案 0 :(得分:7)
ServletContextListener#contextIntialized
是可以分配给"A"::startsWith
的方法引用,当针对其他Predicate<String>
测试Predicate<String>
时,它会检查String { {1}}从其他String
开始,而不是相反。
"A"
不会删除String
中的任何内容,因为“A”既不是以“魔术师”也不是“助理”开头的。
您可以改为使用lambda表达式:
list.removeIf(TTT)
原始list
谓词从列表中删除任何内容的唯一方法是列表是否包含Predicate<String> TTT = s -> s.startsWith("A");
"A"::startsWith
或空String
。
答案 1 :(得分:0)
mTrueButton.setEnabled(false);
mFalseButton.setEnabled(false);
checkAnswer(false); //Display the appropriate Toast
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mTrueButton.setEnabled(true);
mFalseButton.setEnabled(true);
}
}, 1500);
方法参考结合了两种技术。 BiPredicate<String, String> b1 = String::startsWith;
BiPredicate<String, String> b2 = (string, prefix) -> string.startsWith(prefix);
System.out.println(b1.test("chicken", "chick"));
System.out.println(b2.test("chicken", "chick"));
是一个实例方法。这意味着使用了lambda中的第一个参数
作为调用方法的实例。 第二个参数传递给
startsWith()方法本身。这是方法引用如何保存的示例
好好打字。