Java:lambda表达式笔记

认识Lambda表达式:

Lambda表达式是一种用于简化匿名内部类书写方法的表达式。前提:被简化的匿名内部类必须是函数式接口。

函数式接口:1.必须定义成接口。

                      2.该接口中有且仅有一个方法。

匿名内部类:new(){

方法名{

方法体语句}

};

匿名内部类常用于子类需要调用父类中的某个方法,但是要求功能不同,这时我们会将父类中的方法定义成抽象方法,同时将父类定义成抽象方法,通过子类对其进行重写,再定义对象去调用,匿名内部类省去了先重写再创建对象再调用的繁琐过程。例:

abstract class Animal{
    public abstract void cry();


}

class Dog extends Animal {

@override
public void cry(){

system.out.peintln("狗叫");

};


}

public static void main(String[] args){

Dog d = new dog;
dog.cry();
//使用匿名内部类
Animal d2 = new Animal(){
@override
public void cry(){

system.out.peintln("狗叫");

}
};
d2.cry();
}


可以看出,使用匿名内部类明显方便许多,二lambda表达式则是在匿名内部类的写法上再进一步简化。

格式: (被重写方法的形参列表)->{被重写方法的方法体

};

还是以上面的代码为例:

public static void main(String[] args){
Animal dog  = () ->{
system.out.printlnn("狗叫");
};
dog.cry();
}

到底谁更方便,一目了然。

但是这里有一个问题,就是上面定义的类不满足lambda表达式的前提,即:被简化的匿名内部类必须是函数式接口。

很显然,上面的是类不是接口,所以这样写会报错。

因此,我们应该定义一个接口,并在只里面放一个函数。这样就可以书写lambda表达式了。

interface Swimming{
 //大部分函数式接口都会有这个标志,看到就表明该接口可以用lambda表达式书写!
@Functionallinterface 
    void swim();
}

public static void main(String[] args){

Swimming s1 = () ->{
system.out.println("游泳使我快乐");
};
s1.swim();
}

我们再来看一个例子:

public static void main(String[] args){
double [] price = {99,120,65,100};
        //这个方法的作用是把所有数据都打八折然后又存进去(这里的IntToDoubleFunction为函数式接口)
        Arrays.setAll(price, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                return value*0.8;
            }
        });
        System.out.println(Arrays.toString(price));
        //很显然,上面的代码肯定可以用lambda表达式进行书写
        Arrys.setAll(price,(int value)->{
        return value*0.8};)
        System.out.println(Arrays.toString(price));

}

然而这就是lambda表达式最简洁的书写方式了吗,不!还可以简化!

lambda表达式的三条简化规则:

1.参数类型可以省略不写。

2.如果只有一个参数类型,还可以省略括号。(注意:必须是只有一个参数的条件下!多个参数去掉括号会报错!切记!!!)

3.如果方法体中只有一行代码,可以去掉方法体,同时如果此句为return语句,还可以把return语句也去掉!(简单理解:跟if语句后只有一行代码时不用写{}类似)

于是上面的代码我们就可以简化成这样:

public static void main(String[] args){
double [] price = {99,120,65,100};
        //这个方法的作用是把所有数据都打八折然后又存进去(这里的IntToDoubleFunction为函数式接口)
        Arrays.setAll(price, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                return value*0.8;
            }
        });
        System.out.println(Arrays.toString(price));
     //lambda表达式简化(终极版):
    Arrays.setAll(price,value -> value*0.8);
        
}

以上就是lambda表达式的所有内容,此文章为个人学习时所做的笔记,欢迎各位大佬来纠错和讨论。

  • 41
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值