理解具有多个参数的简单lambda

时间:2017-07-02 18:13:01

标签: java lambda

我读过关于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表达式中使用更多参数的原因。

有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

  1. <强>供应商

    () -> true
    

    这不是谓词,而是Supplier(或BooleanSupplier)。没有参数,单个返回值。

    1. <强>谓词

      a -> a.startWith("test")
      

      这是Predicate。单个参数,返回boolean

      1. <强>谓词

        (String a) -> a.startWith("test")
        

        也是Predicate,但显式声明了输入类型。

        1. <强> BiPredicate

          (a,b) -> a.startWith("test")
          

          不是Predicate,而是BiPredicate。它需要两个参数并返回原始boolean

          1. <强> BiPredicate

            (String a, String b) -> a.startWith("test")
            

            也是BiPredicate,但其参数类型是显式的。

          2. 在您的示例中,您期望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类型中解析。