Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you assign a lambda to a variable in Java 8?

Just playing with the new lambda and functional features in Java 8 and I'm not sure how to do this.

For example the following is valid:

    Map<String, Integer> map = new HashMap<>();     map.put("A", 1);     map.put("B", 2);     map.put("C", 3);     map.compute("A", (k, v) -> v == null ? 42 : v + 41)); 

but the following gives me syntax errors:

    BiFunction x = (k, v) -> v == null ? 42 : v + 41;     map.compute("A", x); 

Any ideas?

like image 229
sproketboy Avatar asked Feb 20 '14 21:02

sproketboy


People also ask

How do you assign a lambda expression to a variable in Java?

Using Lambda ExpressionsLambda expressions can be stored in variables if the variable's type is an interface which has only one method. The lambda expression should have the same number of parameters and the same return type as that method.

Can lambda function be assigned to a variable?

Creating a Lambda Function The lambda operator cannot have any statements and it returns a function object that we can assign to any variable.

How do you call a lambda function in Java?

You can invoke a Lambda function by creating an AWSLambda object and invoking its invoke method. Create an InvokeRequest object to specify additional information such as the function name and the payload to pass to the Lambda function.


2 Answers

You have forgotten the generics on your BiFunction:

public static void main(final String[] args) throws Exception {     final Map<String, Integer> map = new HashMap<>();     map.put("A", 1);     map.put("B", 2);     map.put("C", 3);     final BiFunction<String, Integer, Integer> remapper = (k, v) -> v == null ? 42 : v + 41;     map.compute("A", remapper); } 

Running:

PS C:\Users\Boris> java -version java version "1.8.0-ea" Java(TM) SE Runtime Environment (build 1.8.0-ea-b120) Java HotSpot(TM) 64-Bit Server VM (build 25.0-b62, mixed mode) 
like image 101
Boris the Spider Avatar answered Sep 20 '22 17:09

Boris the Spider


As Boris The Spider points out, the specific problem you have is the generics. Depending on context, adding an explicit {} block around the lambda will help add clarity and may be required.

With that, you would get something like:

BiFunction<String, Integer, Integer> x = (String k, Integer v) -> {v == null ? 42 : v + 41}; 

It would be pretty helpful for future readers who have the same problem if you posted your syntax errors so they can be indexed.

This link has some additional examples that might help.

like image 26
JBCP Avatar answered Sep 20 '22 17:09

JBCP