面试题答案
一键面试使用Lambda表达式创建并启动线程
public class LambdaRunnableExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println("This is a thread created using Lambda expression"));
thread.start();
}
}
Lambda表达式提高代码可读性和简洁性的原因
- 简洁性:Lambda表达式通过省略接口声明、方法声明以及不必要的括号等,极大地简化了代码。在传统方式中,使用匿名内部类实现Runnable接口,需要完整地声明接口和
run
方法。例如:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("This is a thread created using anonymous inner class");
}
});
thread.start();
对比可见,Lambda表达式更为简洁。 2. 可读性:Lambda表达式将重点放在代码逻辑本身,即线程要执行的任务上,使代码意图更加清晰。读者能快速聚焦于线程具体要做的事情,而不是被接口和方法声明等冗余结构分散注意力。
与传统匿名内部类实现Runnable接口的主要区别
- 语法结构:
- Lambda表达式:语法更为紧凑,以简洁的方式直接表达行为。如
() -> System.out.println("...")
,只包含参数列表(这里为空)和方法体。 - 匿名内部类:遵循完整的类声明结构,需要声明接口、重写方法等。如上述匿名内部类实现Runnable接口的代码。
- Lambda表达式:语法更为紧凑,以简洁的方式直接表达行为。如
- 编译机制:
- Lambda表达式:编译时会被转换为字节码中的
invokedynamic
指令,在运行时动态绑定方法。这使得Lambda表达式在运行时具有更高的灵活性和效率。 - 匿名内部类:编译后会生成一个独立的匿名内部类字节码文件,增加了类文件的数量和编译后的代码体积。
- Lambda表达式:编译时会被转换为字节码中的
- 作用域:
- Lambda表达式:访问外部变量时,外部变量必须是
final
或事实上的final
(即声明后未再修改)。 - 匿名内部类:可以访问外部类的成员变量,包括非
final
变量,同时也可以访问局部变量,但局部变量同样需要是final
或事实上的final
。
- Lambda表达式:访问外部变量时,外部变量必须是