79 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Lambda Expressions 
 | |
| ---
 | |
| ## Lambda Expressions
 | |
| 
 | |
| Lambda expressions were introduced in Java 8 and it marks Java's foray to the functional programming paradigm. It helps produce readable and concise code and can tremendously simplify your Java applications.
 | |
| 
 | |
| Lambda functions are essentially functions — independent units of code that you can use anywhere you would normally use an object, like passing an argument to a method. In this case, instead of creating a class and then creating an object from the class, or directly using an anonymous class, you write your lambda expression and just pass it to the method instead of a class object.
 | |
| 
 | |
| A lambda expression is composed of three parts — function parameters, the `->` symbol, and a function body.
 | |
| 
 | |
| - The first part, function parameters, indicates what arguments you expect your lambda function to take. For instance, if you are iterating over a list of `Person` objects, you can write the function parameter of the lambda expression as `(Person p)`. If you expect to get two (or more) `Person` objects as arguments, you would separate them with a comma, `(Person p1, Person p2)`. If you don't expect any arguments, you simply use empty parentheses `()`. The rule is that you can omit the parentheses in case your Lambda expression accepts only 1 argument. In all other cases, the parentheses are mandatory.
 | |
| 
 | |
| - Function parameters are followed by the `->` symbol (dash followed by a greater-than symbol).
 | |
| 
 | |
| - The third component of a lambda expression is a function body, which performs the actual work. You write the function body within curly braces `{}`. However, if your function body is just one line, you can omit the `{}` and write it directly after the `->`, like so: 
 | |
| 
 | |
|   ```java
 | |
|    Person p -> System.out.println(p.getName());
 | |
|   ```
 | |
|   This is a complete lambda expression. It accepts a `Person` object as argument and prints its name using the `getName()` getter.
 | |
| 
 | |
| ### Stream API
 | |
| 
 | |
| The `Stream` API was also introduced in Java 8, and can be used to allow chaining of sequential and aggregate operations. Stream operations are either intermediate or terminal in nature.
 | |
| 
 | |
| Normally, the Stream API is used in conjunction with lambda expressions to produce concise code.
 | |
| 
 | |
| In this small example you can see that one of the utilities of a stream is to receive a certain property of all objects in a list and return it in another list using intermediate and terminal operations.
 | |
| 
 | |
| Assume you have a `Student` class like so:
 | |
| 
 | |
| ```java
 | |
| public class Student {
 | |
|   int studentId;
 | |
|   String studentName;
 | |
|   
 | |
|   public String getStudentName() {
 | |
|     return this.studentName;
 | |
|   }
 | |
|   
 | |
|   public int getStudentId() {
 | |
|     return this.studentId;
 | |
|   }
 | |
|    // setters
 | |
| }
 | |
| ```
 | |
| 
 | |
| Now assume you're writing a method which has a list of all the students and you want to get a list of all the student names, which may look something like this:
 | |
| 
 | |
| ```java
 | |
| List<Student> students = /* some list of student objects */;
 | |
| List<String> studentNames = new ArrayList<>();
 | |
| 
 | |
| for(Student student: students) {
 | |
|   studentNames.add(student.getStudentName());
 | |
| }
 | |
| ```
 | |
| 
 | |
| While this isn't a bad idea, it can be simplified using streams into just one line of code:
 | |
| 
 | |
| ```java
 | |
| List<Student> students = /* some list of student objects */;
 | |
| List<String> studentNames = students.stream().map(String::getStudentName).collect(Collectors.toList());
 | |
| ```
 | |
| 
 | |
| The `Stream` API goes over the list of students and uses the intermediate `map` function to return a new Stream using whatever method is on the right of the `::`. 
 | |
| 
 | |
| The terminal `collect` operation collects the stream as a list of strings.
 | |
| 
 | |
| This is only one use of the Streams API used in Java 8. There are many other applications of streams utilizing other operations as seen here in the
 | |
|  [documentation](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html).
 | |
| 
 | |
| #### More Information:
 | |
| <!-- Please add any articles you think might be helpful to read before writing the article -->
 | |
| - [Lambda Expressions](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)
 | |
| - [Java 8 Stream API](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)
 | |
| - [Java 8 Double Colon Operator](https://www.baeldung.com/java-8-double-colon-operator)
 |