我读过关于lambdas的内容,并看到像这样的sintax例子:
() -> true
a -> a.startWith("test")
(String a) -> a.startWith("test")
(a,b) -> a.startWith("test")
(String a, String b) -> a.startWith("test")
好的,我阅读了Predicate接口,并尝试使用简单的字符串列表制作一些小例子。一切正常,但我无法理解。
public class LambdaTests {
public static void main(String...strings){
List<String> al = new ArrayList<>();
al.add("Hola");
al.add("Que");
al.add("Tal");
al.add("Estas");
al.add("Hoy");
al.add("Machupichu");
System.out.println(al);
//al.removeIf(a -> a.contains("a"));
//al.removeIf((String a) -> a.contains("a"));
//al.removeIf((String a) -> { return a.contains("a");} );*/
//al.removeIf((String a, String b) -> { return a.contains("a") || b.contains("a"); } ); NO COMPILE
//predication(al, (a,b) -> a.contains("a") || b.contains("o")); No compile
System.out.println(al);
}
public static void predication(ArrayList al, Predicate<String> checker){
}
}
我真的不知道&#34; b&#34;的起源在哪里?在某些情况下,我只知道removeIf方法接受一个谓词,我创建了另一个(预测)但我不知道在lambda表达式中使用更多参数的原因。
有任何帮助吗?
答案 0 :(得分:1)
<强>供应商强>
() -> true
这不是谓词,而是Supplier
(或BooleanSupplier
)。没有参数,单个返回值。
<强>谓词强>
a -> a.startWith("test")
这是Predicate
。单个参数,返回boolean
。
<强>谓词强>
(String a) -> a.startWith("test")
也是Predicate
,但显式声明了输入类型。
<强> BiPredicate 强>
(a,b) -> a.startWith("test")
不是Predicate
,而是BiPredicate
。它需要两个参数并返回原始boolean
。
<强> BiPredicate 强>
(String a, String b) -> a.startWith("test")
也是BiPredicate
,但其参数类型是显式的。
在您的示例中,您期望Predicate
,但(a, b) -> a.contains("a") || b.contains("o")
是BiPredicate
,因此无法编译。您可以将方法更改为以下public static void predication(List<String> al, BiPredicate<String, String> checker)
。
另请注意,参数已更改为List<String>
而非ArrayList<String>
。由于您的变量已从List
类型中解析。