个性化阅读
专注于IT技术分析

Java Lambda表达式

本文概述

Lambda表达式是Java SE 8中包含的Java的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在收藏库中非常有用。它有助于迭代, 过滤和从集合中提取数据。

Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用lambda表达式的情况下, 我们无需再次定义用于提供实现的方法。在这里, 我们只编写实现代码。

Java lambda表达式被视为函数, 因此编译器不会创建.class文件。

功能介面

Lambda表达式提供了功能接口的实现。只有一种抽象方法的接口称为功能接口。 Java提供了@FunctionalInterface注释, 用于将接口声明为功能接口。


为什么要使用Lambda表达式

  1. 提供执行功能的接口。
  2. 更少的编码。

Java Lambda表达式语法

(argument-list) -> {body}

Java lambda表达式由三个组件组成。

1)参数列表:也可以为空或非空。

2)箭头令牌:用于链接参数列表和表达式主体。

3)主体:它包含lambda表达式的表达式和语句。

无参数语法

() -> {
//Body of no parameter lambda
}

一参数语法

(p1) -> {
//Body of single parameter lambda
}

两参数语法

(p1, p2) -> {
//Body of multiple parameter lambda
}

让我们看一下我们不实现Java lambda表达式的情况。在这里, 我们不使用lambda表达式来实现接口。

没有Lambda表达式

interface Drawable{
	public void draw();
}
public class LambdaExpressionExample {
	public static void main(String[] args) {
		int width=10;

		//without lambda, Drawable implementation using anonymous class
		Drawable d=new Drawable(){
			public void draw(){System.out.println("Drawing "+width);}
		};
		d.draw();
	}
}

立即测试

输出:

Drawing 10

Java Lambda表达式示例

现在, 我们将借助Java lambda表达式来实现上述示例。

@FunctionalInterface  //It is optional
interface Drawable{
	public void draw();
}

public class LambdaExpressionExample2 {
	public static void main(String[] args) {
		int width=10;
		
		//with lambda
		Drawable d2=()->{
			System.out.println("Drawing "+width);
		};
		d2.draw();
	}
}

立即测试

输出:

Drawing 10

Lambda表达式可以具有零个或任意数量的参数。让我们看看示例:

Java Lambda表达式示例:无参数

interface Sayable{
	public String say();
}
public class LambdaExpressionExample3{
public static void main(String[] args) {
	Sayable s=()->{
		return "I have nothing to say.";
	};
	System.out.println(s.say());
}
}

立即测试

输出:

I have nothing to say.

Java Lambda表达式示例:单个参数

interface Sayable{
	public String say(String name);
}

public class LambdaExpressionExample4{
	public static void main(String[] args) {
	
		// Lambda expression with single parameter.
		Sayable s1=(name)->{
			return "Hello, "+name;
		};
		System.out.println(s1.say("Sonoo"));
		
		// You can omit function parentheses  
		Sayable s2= name ->{
			return "Hello, "+name;
		};
		System.out.println(s2.say("Sonoo"));
	}
}

立即测试

输出:

Hello, Sonoo
Hello, Sonoo

Java Lambda表达式示例:多个参数

interface Addable{
	int add(int a, int b);
}

public class LambdaExpressionExample5{
	public static void main(String[] args) {
		
		// Multiple parameters in lambda expression
		Addable ad1=(a, b)->(a+b);
		System.out.println(ad1.add(10, 20));
		
		// Multiple parameters with data type in lambda expression
		Addable ad2=(int a, int b)->(a+b);
		System.out.println(ad2.add(100, 200));
	}
}

立即测试

输出:

30
300

Java Lambda表达式示例:带有或不带有return关键字

在Java lambda表达式中, 如果只有一条语句, 则可以使用也可以不使用return关键字。当lambda表达式包含多个语句时, 必须使用return关键字。

interface Addable{
	int add(int a, int b);
}

public class LambdaExpressionExample6 {
	public static void main(String[] args) {
		
		// Lambda expression without return keyword.
		Addable ad1=(a, b)->(a+b);
		System.out.println(ad1.add(10, 20));
		
		// Lambda expression with return keyword.  
		Addable ad2=(int a, int b)->{
							return (a+b); 
						    };
		System.out.println(ad2.add(100, 200));
	}
}

立即测试

输出:

30
300

Java Lambda表达式示例:Foreach循环

import java.util.*;
public class LambdaExpressionExample7{
	public static void main(String[] args) {
		
		List<String> list=new ArrayList<String>();
		list.add("ankit");
		list.add("mayank");
		list.add("irfan");
		list.add("jai");
		
		list.forEach(
			(n)->System.out.println(n)
		);
	}
}

立即测试

输出:

ankit
mayank
irfan
jai

Java Lambda表达式示例:多个语句

@FunctionalInterface
interface Sayable{
	String say(String message);
}

public class LambdaExpressionExample8{
	public static void main(String[] args) {
	
		// You can pass multiple statements in lambda expression
		Sayable person = (message)-> {
			String str1 = "I would like to say, ";
			String str2 = str1 + message; 
			return str2;
		};
			System.out.println(person.say("time is precious."));
	}
}

立即测试

输出:

I would like to say, time is precious.

Java Lambda表达式示例:创建线程

你可以使用lambda表达式来运行线程。在下面的示例中, 我们通过使用lambda表达式实现run方法。

public class LambdaExpressionExample9{
	public static void main(String[] args) {
	
		//Thread Example without lambda
		Runnable r1=new Runnable(){
			public void run(){
				System.out.println("Thread1 is running...");
			}
		};
		Thread t1=new Thread(r1);
		t1.start();
		//Thread Example with lambda
		Runnable r2=()->{
				System.out.println("Thread2 is running...");
		};
		Thread t2=new Thread(r2);
		t2.start();
	}
}

立即测试

输出:

Thread1 is running...
Thread2 is running...

Java lambda表达式可以在收集框架中使用。它提供了有效而简洁的方法来迭代, 过滤和获取数据。以下是一些lambda和提供的示例。

Java Lambda表达式示例:比较器

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Product{
	int id;
	String name;
	float price;
	public Product(int id, String name, float price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
}
public class LambdaExpressionExample10{
	public static void main(String[] args) {
		List<Product> list=new ArrayList<Product>();
		
		//Adding Products
		list.add(new Product(1, "HP Laptop", 25000f));
		list.add(new Product(3, "Keyboard", 300f));
		list.add(new Product(2, "Dell Mouse", 150f));
		
		System.out.println("Sorting on the basis of name...");

		// implementing lambda expression
		Collections.sort(list, (p1, p2)->{
		return p1.name.compareTo(p2.name);
		});
		for(Product p:list){
			System.out.println(p.id+" "+p.name+" "+p.price);
		}

	}
}

立即测试

输出:

Sorting on the basis of name...
2 Dell Mouse 150.0
1 HP Laptop 25000.0
3 Keyboard 300.0

Java Lambda表达式示例:过滤器收集数据

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream; 
class Product{
	int id;
	String name;
	float price;
	public Product(int id, String name, float price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
}
public class LambdaExpressionExample11{
	public static void main(String[] args) {
		List<Product> list=new ArrayList<Product>();
		list.add(new Product(1, "Samsung A5", 17000f));
		list.add(new Product(3, "Iphone 6S", 65000f));
		list.add(new Product(2, "Sony Xperia", 25000f));
		list.add(new Product(4, "Nokia Lumia", 15000f));
		list.add(new Product(5, "Redmi4 ", 26000f));
		list.add(new Product(6, "Lenevo Vibe", 19000f));
		
		// using lambda to filter data
		Stream<Product> filtered_data = list.stream().filter(p -> p.price > 20000);
		
		// using lambda to iterate through collection
		filtered_data.forEach(
				product -> System.out.println(product.name+": "+product.price)
		);
	}
}

立即测试

输出:

Iphone 6S: 65000.0
Sony Xperia: 25000.0
Redmi4 : 26000.0

Java Lambda表达式示例:事件监听器

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class LambdaEventListenerExample {
	public static void main(String[] args) {
		JTextField tf=new JTextField();
		tf.setBounds(50, 50, 150, 20);
		JButton b=new JButton("click");
		b.setBounds(80, 100, 70, 30);
		
		// lambda expression implementing here.
		b.addActionListener(e-> {tf.setText("hello swing");});
		
		JFrame f=new JFrame();
		f.add(tf);f.add(b);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLayout(null);
		f.setSize(300, 200);
		f.setVisible(true);

	}

}

输出:

Java Lambda事件处理示例
赞(0)
未经允许不得转载:srcmini » Java Lambda表达式

评论 抢沙发

评论前必须登录!