Abdul Rahman
Abdul Rahman

Reputation: 1384

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

Upvotes: 15

Views: 6357

Answers (1)

Tunaki
Tunaki

Reputation: 137064

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();

Upvotes: 28

Related Questions