接下来,笔者将以简单的说话方式向你介绍java8的新特性,lambda表达式。
用最简单的方式告诉你为什么需要 lambda 表达式
简单地来解释委托,就是“把方法作为参数传递”。
历史来源:
有时候需要传入一段代码到程序的方法中。
如:
public class MainClass(){
public static final void test(){
if(true){
//执行一段经常修改的代码
//王奶奶去了刘奶奶家送牛奶
//……
//王奶奶回家
}else if{
//什么都不执行
}
}
}
出于某种原因,if 中的代码必须频繁修改。
这个时候就需要把方法写在对象的方法中,然后把对象传入到程序中调用对应的方法。(重构)
public class MainClass(){
public static final void test(MilkSender c){
if(true){
c.sendMilk();
}else if{
//什么都不执行
}
}
}
public class MilkSender (){
public void sendMilk(){
//执行一段经常修改的代码
//王奶奶去了刘奶奶家送牛奶
//……
//王奶奶回家
}
}
MainClass.test(new MilkSender());
这个时候我们不需要硬编码地修改 test 中的代码,就可以达到 “在方法中运行自定义编码” 的效果。
不过现在,我们只需要MyClass对象中的一个方法而已,把整个MyClass对象都传进去,显得有些乱,
有没有什么方法能让我们只传入一个方法呢?
答案是有的:传入一个接口即可。
public static final void test(MyClassInterface c){
if(true){
c.doSomething();
}
}
public interface MyClassInterface (){
public void doSomething();
}
这种形式的编码我们暂时称为方法委托。(因为这种叫法来源于C/C++)
这样做以后,每次都可以直接创建“匿名对象”
MainClass.test(new MyClass(){
@Override
public void doSomething(){
System.out.println("good1");
}
);
MainClass.test(new MyClass(){
@Override
public void doSomething(){
System.out.println("good2");
}
);
这种形式的编码,我们称为匿名对象编码。
嗯,稍微好看点了,但是看起来还是很不舒服:
有时候只是需要一句代码,却写了至少5行的代码。(带来了可读性与“高度”问题)
所以为了解决“高度问题”,我们引入lambda表达式。
public void main(String[] args){
DamnedDesigner.test(()->System.out.println("good1"));
DamnedDesigner.test(()->System.out.println("good2"));
}
原来冗长的代码一下子变得清晰、简洁、快速。
lambda表达式不仅仅用于Java,也应用于C#、C++等常用编程语言。
lambda表达式是java8最大的亮点。(咳咳,虽然落后了十年左右才开始)。
java8在国内虽然普及率相当低,但是笔者相信这将无法避免地成为未来的趋势。
你已经了解到:方法委托是啥,匿名对象是啥,lambda表达式是啥。
(你问我lambda表达式实用吗,那就厉害了!)
lambda表达式具体介绍请看下篇。