Reputation: 6403
I'm trying to declare and define larger hash map at once. This is how I do it:
public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
put(x, y);
put(x, y);
}};
But, when I try to use lambda expressions in body of put
, I'm hitting on eclipse warrning/error. This is how I use lambda in HashMap:
public HashMap<Integer, Callable<String>> opcode_only = new HashMap<Integer, Callable<String>>() {{
put(0, () -> { return "nop"; });
put(1, () -> { return "nothing...."; });
}};
Eclipse underlines whole part of lambda starting with comma before. Error messages:
Syntax error on token ",", Name expected
Syntax error on tokens, Expression expected instead
Does anybody know what am I doing wrong? Is initialization by lambda expression allowed in HashMap
? Please help.
Upvotes: 15
Views: 21432
Reputation: 3842
You are doing correct, update JDK library to 1.8 version from Java Build Path in Eclipse Project properties.
I just now tried the below code and it is working fine on my Eclipse:
HashMap<Integer, Integer> hmLambda = new HashMap<Integer, Integer>() {
{
put(0, 1);
put(1, 1);
}
};
System.out.println(hmLambda.get(0));
hmLambda.forEach((k, v) -> System.out.println("Key " + k
+ " and Values is: " + v));
Upvotes: 4
Reputation: 513
As far as I know Netbeans 7.4 fully supports Java 8. I had Problems with eclipse (atm it's not supporting java8 so it's just able to compile the old Lambda expressions of 7), that's why i switched to Netbeans. If you've installed an earlier Version of Netbeans please make sure to FULLY uninstall it to make sure the newer one isn't able to refer to old Logfiles etc.
Upvotes: 0
Reputation: 6242
This works fine in the Netbeans Lamba builds downloaded from: http://bertram2.netbeans.org:8080/job/jdk8lambda/lastSuccessfulBuild/artifact/nbbuild/
import java.util.*;
import java.util.concurrent.Callable;
public class StackoverFlowQuery {
public static void main(String[] args) throws Exception {
HashMap<Integer, Callable<String>> opcode_only =
new HashMap<Integer, Callable<String>>() {
{
put(0, () -> {
return "nop";
});
put(1, () -> {
return "nothing....";
});
}
};
System.out.println(opcode_only.get(0).call());
}
}
Upvotes: 7