[英]Using method reference to remove elements from a List
我的代码出了什么问题?
我想从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
不会从列表中删除任何内容。
"A"::startsWith
是一个可以分配给Predicate<String>
的方法引用,当针对其他String
测试该Predicate<String>
,它将检查字符串"A"
是否以该其他String
开头,而不是相反。
list.removeIf(TTT)
不会从list
删除任何内容,因为“A”既不是以“魔术师”也不是“助手”开头的。
您可以使用lambda表达式:
Predicate<String> TTT = s -> s.startsWith("A");
原始"A"::startsWith
谓词将从列表中删除任何内容的唯一方法是列表是否包含String
"A"
或空String
。
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"));
方法参考结合了两种技术。 **startsWith()**
是一个实例方法。 这意味着lambda中的第一个参数用作调用该方法的实例 。 第二个参数传递给startsWith()方法本身 。 这是方法引用如何节省大量输入的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.