$show=/label

Java 8: Accessing Variables from Lambda Expressions

SHARE:

A quick guide to accessing variables from lambda expressions in Java 8 Streams.

1. Overview

In this tutorial, We'll learn about how to access variables from Lambda Expressions in Java 8.

Before that, We suggest you read the tutorial on Java 8 Lambda Expressions discussed in the previous tutorial.

If you already know about Lambda's, just ignore and continue reading this article.

Can we declare a variable inside Lambda Expression?

Java 8: Accessing Variables from Lambda Expressions


The answer is yes. We can declare variables as many as needed.

What do you think if lambda has a reference to another variable?

Here, We have two scenarios to know.

First, What will happen for local variables in Lambda.

Second, Non-local variables to Lambda.


Creating a Functional Interface.

@FunctionalInterface
interface BookInterface {
 int getBooksCount(String catefory);
}

Complete guide to Functional Interfaces in Java 8.

2. Local Variables To Lambda


We can declare any type of variable in a Lambda block as similar to declaring variables inside a method.

In the below example, creating a lambda expression with local variable localLamdbdaVar.

public class LambdaVariables {
 public static void main(String[] args) {

  BookInterface bookInterface = (catefory) -> {
   int localLamdbdaVar = 10; // Local Variable to Lambda and can not be accessed from outside of it.
   
   // some logic to get books count from Library for a Category.
   localLamdbdaVar++; // Incrementing value by 1.

   return localLamdbdaVar;
  };

  int count = bookInterface.getBooksCount("Technology");
  System.out.println("count " + count);
 }
}

This program compiles and runs with no errors.

Output:

count 11

If we declare the same variable outside lambda like below, it will through compile time error.

int localLamdbdaVar = 5; 
BookInterface bookInterface = (catefory) -> {
 int localLamdbdaVar = 10; // Local Variable to Lambda and can not be accessed from outside of it.
 
 // some logic to get books count from Library for a Category.
 localLamdbdaVar++; // Incrementing value by 1.

 return localLamdbdaVar;
};

Error: Lambda expression's local variable localLamdbdaVar cannot redeclare another local variable defined in an enclosing scope.

Because compiler saying error at below line inside Lambda.

int localLamdbdaVar = 10;

Already, We have outside a Lambda variable is declared with the same name. So, We can not redeclare it.

Java 8 Examples Programs Before and After Lambda & Streams

3. Non-Local To Lambda


Now, we will remove the variable localLamdbdaVar from Lambda and add it outside as below.

int localLamdbdaVar = 10; 
BookInterface bookInterface = (catefory) -> {

 // some logic to get books count from Library for a Category.
 localLamdbdaVar++; // Incrementing value by 1.

 return localLamdbdaVar;
};

Variable localLamdbdaVar is declared in enclosed scope.

At compile time it fails with reason "Local variable localLamdbdaVar defined in an enclosing scope must be final or effectively final" at localLamdbdaVar++;

Because localLamdbdaVar value is getting changed inside the lambda. It is not allowed in Lambda. Because whatever the changes are done inside Lambda is not visible to the enclosed scope.

Note: Changes are made to a variable (which is declared in enclosed scope or Outside Lambda) inside Lambda is not visible to the enclosed block. If the value is modified then enclosed block cannot find them. Because of this compile will through compile time error saying "variable must be final or effective final"

Effectively Final variable is a variable or parameter whose value isn’t changed after it is initialized.

Below is the solution using effective final variable.

int localLamdbdaVar = 10; 
BookInterface bookInterface = (catefory) -> {
 // some logic to get books count from Library for a Category.
 return localLamdbdaVar;
};

Here, Compiler considers localLamdbdaVar variable as effective final.

Note:
If we try to change the value either in the lambda itself or elsewhere in the enclosing scope, we will get an error.
No keyword is required to declare a variable as an effective final.
Enclosed variables can be used at any place in Lambda but the value can not be changed.

4. Conclusion


In this tutorial, We've seen how to access the variables in Lambda Expressions.

Learned the behavior inside and outside declaring the variables.

If the enclosed variable is not modified then it is said to be Effectively Final Variable and can be used inside Lambda.

All the code shown in this example is over GitHub.

COMMENTS

BLOGGER

About Us

Author: Venkatesh - I love to learn and share the technical stuff.
Name

accumulo,1,ActiveMQ,2,Adsense,1,API,37,ArrayList,18,Arrays,24,Bean Creation,3,Bean Scopes,1,BiConsumer,1,Blogger Tips,1,Books,1,C Programming,1,Collection,8,Collections,37,Collector,1,Command Line,1,Comparator,1,Compile Errors,1,Configurations,7,Constants,1,Control Statements,8,Conversions,6,Core Java,149,Corona India,1,Create,2,CSS,1,Date,3,Date Time API,38,Dictionary,1,Difference,2,Download,1,Eclipse,3,Efficiently,1,Error,1,Errors,1,Exceptions,8,Fast,1,Files,17,Float,1,Font,1,Form,1,Freshers,1,Function,3,Functional Interface,2,Garbage Collector,1,Generics,4,Git,9,Grant,1,Grep,1,HashMap,2,HomeBrew,2,HTML,2,HttpClient,2,Immutable,1,Installation,1,Interview Questions,6,Iterate,2,Jackson API,3,Java,32,Java 10,1,Java 11,6,Java 12,5,Java 13,2,Java 14,2,Java 8,128,Java 8 Difference,2,Java 8 Stream Conversions,4,java 8 Stream Examples,12,Java 9,1,Java Conversions,14,Java Design Patterns,1,Java Files,1,Java Program,3,Java Programs,114,Java Spark,1,java.lang,4,java.util. function,1,JavaScript,1,jQuery,1,Kotlin,11,Kotlin Conversions,6,Kotlin Programs,10,Lambda,2,lang,29,Leap Year,1,live updates,1,LocalDate,1,Logging,1,Mac OS,3,Math,1,Matrix,6,Maven,1,Method References,1,Mockito,1,MongoDB,3,New Features,1,Operations,1,Optional,6,Oracle,5,Oracle 18C,1,Partition,1,Patterns,1,Programs,1,Property,1,Python,2,Quarkus,1,Read,1,Real Time,1,Recursion,2,Remove,2,Rest API,1,Schedules,1,Serialization,1,Servlet,2,Sort,1,Sorting Techniques,8,Spring,2,Spring Boot,23,Spring Email,1,Spring MVC,1,Streams,31,String,61,String Programs,28,String Revese,1,StringBuilder,1,Swing,1,System,1,Tags,1,Threads,11,Tomcat,1,Tomcat 8,1,Troubleshoot,26,Unix,3,Updates,3,util,5,While Loop,1,
ltr
item
JavaProgramTo.com: Java 8: Accessing Variables from Lambda Expressions
Java 8: Accessing Variables from Lambda Expressions
A quick guide to accessing variables from lambda expressions in Java 8 Streams.
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAdQk0sT3ffP_hKB8dshS7VZywLScPfkxqVhPz-MdO4uK4XoEVsaDUxGIvcDpVBA_Uxy0S6riuYiw50GDmd1cPNy9qPdp0b05mSkz9VXSX8h0vnFRb1yYBgIADvNw6kKV2FqG4xZHTW30/s320/Java+8+Accessing+Variables+from+Lambda+Expressions.png
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAdQk0sT3ffP_hKB8dshS7VZywLScPfkxqVhPz-MdO4uK4XoEVsaDUxGIvcDpVBA_Uxy0S6riuYiw50GDmd1cPNy9qPdp0b05mSkz9VXSX8h0vnFRb1yYBgIADvNw6kKV2FqG4xZHTW30/s72-c/Java+8+Accessing+Variables+from+Lambda+Expressions.png
JavaProgramTo.com
https://www.javaprogramto.com/2019/07/lambda-accessing-Variable.html
https://www.javaprogramto.com/
https://www.javaprogramto.com/
https://www.javaprogramto.com/2019/07/lambda-accessing-Variable.html
true
3124782013468838591
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content