Java8—Lambda

一、 Why Lambda

原因:
为了让代码更简洁,更优雅,优化程序。

Lambda表达式可以看做函数式编程的子集。

之前看过一位博主的写的一句便于理解的一种说法:

Lambda表达式,其实是一段可传递的代码。
它的本质是以类的身份,干方法的活。

博主:bravo1988

可以在知乎搜到他。

精辟!!!

二、Lambda的一些特性

例子:

接口:

public interface MyRunnable {
	void run();
}

实现类1

public class ByTrain implements MyRunnable {
	@Override
	public void run() {
		System.out.println("去12306买了一张票");
		System.out.println("坐火车...");
	}
}

实现类2

public class ByAir implements MyRunnable {
@Override
public void run() {
System.out.println("在某App上订了飞机票");
System.out.println("坐飞机...");
}
}

调用类

public class MyThread {

	// 成员变量
	private MyRunnable target;

	public MyThread() {}

	// 构造方法,接收外部传递的出行策略
	public MyThread(MyRunnable target) {
		this.target = target;
	}

	// MyThread自己的run(),现在基本不用了
	public void run() {
		System.out.println("去12306买了一张票");
		System.out.println("坐火车...");
	}

	// 如果外部传递了出行策略,就会调用该策略里的run()
	public void start() {
		if (target != null) {
			target.run();
		} else {
			this.run();
		}
	}
}

匿名内部类启动类(Java8之前能做到的最好的优化)

public class Demo {
	public static void main(String[] args) {
		new MyThread(new MyRunnable() {
			@Override
			public void run() {
				System.out.println("不用买票");
				System.out.println("骑电瓶车...");
			}
		}).start();
	}
}

这时候是通过对象的方式传递

Java8使用Lambda改善

public class Demo {
	public static void main(String[] args) {
		new MyThread(() -> {
			System.out.println("不用买票");
			System.out.println("骑电瓶车...");
		}).start();
	}
}

我们会发现new MyThread()这个构造方法原本需要传递一个MyRunnable接口的子类对象(匿名类对象),但我们扔一个Lambda表达式进去,它也接受了,这说明Lambda表达式在身份上与匿名类对象等价

并且我们会发现传进去的lambda表达式中最后干活的是那个sout语句,而sout语句是在方法中(方法是对代码块的封装),所以说Lambda表达式在作用上与方法等价

总结自:
知乎博主:bravo1988
的博客

上一篇:Java8新特性——Stream API的终止操作


下一篇:Java_新特性(Java8---->Java11)