Reputation: 1384
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
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