Lamda表达式

Lamda表达式

函数式编程思想

强调的是做什么,而不是以什么样的方式来做,它忽略了面向对象的复杂语法,只要能够获取到结果,怎么做的都不重要,重要的是结果,不重视过程.

冗余的代码写法:
public class Demo01{
      public static void main(String[] args){
            //匿名内部类的方式
            new Thread(new Runnable(){

                  @Override
                  public  void  run(){
                        System.out.println("开启啦一个新的线程任务");
                  }
            }).start(;)
      }
}
代码分析

对于Runnable的匿名内部类用法,可以分析以下内容:

  • Thread类需要Runnable接口作为参数,其中抽象方法run用来指定线程任务内容的核心
  • 为了指定run方法体,不得不需要实现Runnable接口的抽象类
  • 为了省去定义一个Runnable实现类的麻烦,不得不使用匿名内部类
  • 必须重写抽象方法run方法.所以方法的名称,方法的参数,方法的返回值不得不再写一遍,且不能写错.
  • 在这时刻,只有方法体才是线程任务的关键性内容,所以引入Landa表达式简化代码
编程思想的转换

做什么.而不是怎么做
我们真正希望的是:就是将run方法体内的代码传递给Thread类,启动线程可以执行这些代码即可.
传递代码是我们最终要做的事情
2014年3月Oracle官方所发布的java8(JDK1.8)中,加入了Lamda表达式

体验Lamda表达式的更优写法

Java 8的新特性.优化刚才的代码

public class Demo01{
      public static void main(String[] args){
            //匿名内部类的方式
            new Thread(()->{
                        System.out.println("开启啦一个新的线程任务");
                  }
            }).start();
      }
}

从上面的代码可以看出:没有创建接口实现类对象的操作,也不再有抽象方法覆盖重写的操作,只写啦线程任务的内容.
案例:
定义一个厨子接口,有一个抽象方法做饭的方法,无参无返回值 ,然后用Lamda表达式的方式实现输出一条语句

//定义一个厨子接口
public interface Cook {	
      public abstract void cooking();
}
//用lamda表达式实现
public static void main(String[] args) {
	//这是匿名类的写法	
	Cook cook= new Cook() {
		@Override
		public void cooking() {
		      System.out.println("我今天吃的是红烧茄子,吃的好开心");	
		}
	};
	//Lamda表达式的写法
	Cook cook = ()->{ 
		System.out.println("我今天吃的是红烧茄子,吃的好开心");
		};
	cook.cooking();
	}
}

Lamda表达式
Lamda表达式
Lamda表达式

练习3:给定一个计算器接口, 内置了一个抽象方法计算的方法, 可以将两个double类型的数字 相加得到和值。使用.ambda表达式来实现以上需求。(有参 有返回)
代码示例:
Lambda省略格式
可推导即可省略
Lambda强调的是做什么”,而不是“怎么做",所以凡是可以根据上下文推导得知的信息,都可以省略。比如:

invokeSum(3.14, 3.15, (double d1,double d2) -> {
return d1 + d2;
});
//省略格式表达
invokeSum(3.14,3.15,(d1,d2) ->d1+d2);

省略的规则:
在Lambda标准格式的表达式的基础上,使用省略写法的规则是:
1.小括号内参数的类型可以省略。
2.如果小括号内有且仅有个参数, 则小括号也可以省略
3.如果大括号内有且仅有个语句,则无论是否有返回值, 都可以省略大括号、return关键字和语句的分号。

Lambda的使用前提

Lambda的语法非常的简洁,使用非常的简单,但是有以下注意事项:
1.使用L ambda必须具有接口,且要求接口中有且仅有一个抽象方法
无论JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯, 才可以使用L ambda
2.使用L ambda必须具有上下文推断。
也就是方法的参数或者局部变量类型必须为ambda对应的接]类型,才能使用L ambda作为该接[的实例。
备注: 有且仅有一个抽象方法的接口,称为函数式接口

上一篇:Linq、Lamda、SQL的基本使用以及对比


下一篇:Netsharp快速入门(之4) 基础档案(之C 实体建模 计量单位、商品、往来单位)