Search code examples
javalambdajava-8functional-interface

Java 8 lambdas execution


How can I do something like this in Java 8?

boolean x = ((boolean p)->{return p;}).apply(true);

Right now I get the following error:

The target type of this expression must be a functional interface


Solution

  • As per the JLS section 15.27:

    It is a compile-time error if a lambda expression occurs in a program in someplace other than an assignment context (§5.2), an invocation context (§5.3), or a casting context (§5.5).

    It is also possible to use a lambda expression in a return statement.

    We can then rewrite your example in four different ways:

    • By creating an assignment context:

      Function<Boolean, Boolean> function = p -> p;
      boolean x = function.apply(true);
      
    • By creating an invocation context:

      foobar(p -> p);
      
      private static void foobar(Function<Boolean, Boolean> function) {
          boolean x = function.apply(true);
      }
      
    • By creating a casting context:

      boolean x = ((Function<Boolean, Boolean>) p -> p).apply(true);
      
    • Using a return statement:

      boolean x = function().apply(true);
      
      private static Function<Boolean, Boolean> function() {
          return p -> p;
      }
      

    Also, in this simple example, the whole lambda expression can be rewritten as:

    UnaryOperator<Boolean> function = UnaryOperator.identity();