1) Final variable can be accessed in lambda expression in java 8 (Behavior same as anonymous inner class)
@FunctionalInterface
interface CalculatorInterface {
Integer sumMethod(Integer val1, Integer val2);
}
public class LambdaExpressionScopeExample {
public static void main(String[] args) {
// Final Local variable can be accessed in lambda expression in java 8
final int x = 1; // Final Local variable
// Provide implementation (definition) of sumMethod - using Lambda expression
CalculatorInterface sum = (val1, val2) -> {
return val1 + val2 + x;
};
// Call sumMethod
Integer result = sum.sumMethod(2, 3);
System.out.println("sumResult = "+result); // 6
}
}
/*
sumResult = 6
*/
|
2) non-Final variable can be accessed in lambda expression in java 8
Though non-Final variable can be accessed in lambda expression, But it is effectively final in lambda expression in java 8 ( Again Behavior same as anonymous inner class).
So, you use non-final variable in Lambda expression BUT you cannot modify x in lambda expression.
Any attempt to modify x will produce compilation error.
What will be exact compilation error in eclipse in java 8 ?
“Local variable x defined in an enclosing scope must be final or effectively final.”
@FunctionalInterface
interface CalculatorInterface {
Integer sumMethod(Integer val1, Integer val2);
}
public class LambdaExpressionScopeExample {
public static void main(String[] args) {
// Though non-Final local variable can be accessed in lambda expression
// But it is effectively final in lambda expression.
//So, you cannot modify x in lambda expression.
//Any attempt to modify x will produce compilation error in java 8.
int x = 1; // Non-Final Local variable
CalculatorInterface sum = (val1, val2) -> {
x = x + 1; //COMPILATION ERROR
return val1 + val2 + x;
};
}
}
|
Interesting to see very important internal working : why local class does not allow access to non-local final variable.
3) Accessing Instance and static variable in Lambda Expression in java 8 >
- Instance variable can be accessed (and modified unlike local variable) in lambda expression in java 8
- Static variable can be accessed (and modified unlike local variable) in lambda expression in java 8
@FunctionalInterface
interface CalculatorInterface {
Integer sumMethod(Integer val1, Integer val2);
}
public class LambdaExpressionScopeExample {
// Instance variable can be accessed in lambda expression in java 8
int instanceVariable = 1; // Instance variable
// Static variable can be accessed in lambda expression in java 8
static int staticVariable = 2; // Static variable
public static void main(String[] args) {
LambdaExpressionScopeExample obj = new LambdaExpressionScopeExample();
// Provide implementation (definition) of sumMethod - using Lambda expression
CalculatorInterface sum = (val1, val2) -> {
return val1 + val2 +
+ obj.instanceVariable // Access Instance variable in lambda expression
+ staticVariable; // Access static variable in lambda expression
};
// Call sumMethod
Integer sumResult = sum.sumMethod(2, 3);
System.out.println("sumResult = "+sumResult); // 8
}
}
/*OUTPUT
sumResult = 8
*/
|