Java Lambda表达式学习笔记

一、Lambda表达式定义

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

  • λ希腊字母表中排序第十一位的字母,英语名称为Lambda
  • 实质属于函数式编程的概念
  • 基本语法
    (params) -> expression [表达式]
    (params) -> statement [语句]
    (params) -> { statements }

例如:new Thread ( () -> System.out.println("I like lambda.") ).start();

二、为什么要使用Lambda表达式

  • 避免匿名内部类定义过多
  • 可以让你的代码看起来很简洁
  • 去掉了一堆没有意义的代码,只留下核心的逻辑

也许你会说,我看了Lambda表达式不但不觉得简洁,反而觉得更看不懂了。是因为我们还没有习惯,用的多看习惯了就好了。

三、使用Lamda表达式

理解Functional Interface (函数式接口)是学习Java8 lambda表达式的关键所在。

1. 函数式接口的定义

  • 任何接口,如果只包含唯一个抽象方法, 那么它就是一个函数式接口
public interface Runnable {
	public abstract void run();
}
  • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

2. 推导Lambda表达式

/*
推导Lambda
 */

public class TestLambda {
    //3.或者使用静态内部类
    static class Like2 implements ILike {
        @Override
        public void lambda() {
            System.out.println("I like lambda.");
        }
    }

    public static void main(String[] args) {
        //4.局部内部类
        class Like3 implements ILike {
            @Override
            public void lambda() {
                System.out.println("I like lambda.");
            }
        }

        //5.匿名内部类
        ILike like4 = new ILike() {
            @Override
            public void lambda() {
                System.out.println("I like lambda.");
            }
        };

        ILike like = new Like();
        ILike like2 = new Like2();
        ILike like3 = new Like3();

        like.lambda();
        like2.lambda();
        like3.lambda();
        like4.lambda();

        //6.使用Lambda简化
        ILike like5  = () -> {
            System.out.println("I like Lambda.");
        };

        like5.lambda();
    }
}

//1.定义一个函数式接口
interface ILike {
    void lambda();
}

//2.实现类
class Like implements ILike {
    @Override
    public void lambda() {
        System.out.println("I like lambda.");
    }
}

3. 使用简化Lambda表达式

简化 Lambda 表达式的准则:

  • 如果可以推导出一个 lambda 表达式的参数类型,则可以忽略类型。
  • 如果方法只有一个参数,而且这个参数的类型可以推导,那么可以省略括号。
public class TestLambda2 {

    public static void main(String[] args) {

        ILove love = new ILove() {
            @Override
            public void lambda(String s) {
                System.out.println("I love " + s);
            }
        };

        //使用lambda简化
        ILove love2 = (String s) -> {
            System.out.println("I love " + s);
        };

        //简化参数类型, 因为可以类型推倒
        ILove love3 = (s) -> {
            System.out.println("I love " + s);
        };

        //简化参数括号
        ILove love4 = s -> {
            System.out.println("I love " + s);
        };
        ILove love5 = s -> {
            System.out.println("I love " + s);
            System.out.println("I love you");
        };

        //简化大括号
        ILove love6 = s -> System.out.println("I love " + s);
        IHave have = (s1, s2) -> System.out.println("I have " + s1 + " and " + s2);

        //总结:
        //使用lambda表达式前提为使用函数式接口
        //lambda表达式只能有一行代码的情况才能简化成一行,否则需要使用代码块包裹{}
        //多个参数可以去掉参数类型,多个参数不能去掉括号()

        love.lambda("lambda.");
        love2.lambda("lambda.");
        love3.lambda("lambda.");
        love4.lambda("lambda.");
        love5.lambda("lambda.");
        love6.lambda("lambda.");

        have.lambda("apple", "banana");

		new ILobe((s) -> { System.out.println("I love you");});
		new ILobe(s -> 
			System.out.println("I love you"));
    }
}

interface ILove {
    void lambda(String s);
}

interface IHave {
    void lambda(String s1, String s2);
}

4. 总结

  • 使用lambda表达式前提为使用函数式接口
  • lambda表达式只能有一行代码的情况才能简化成一行,否则需要使用代码块包裹 { }
  • 因为有类型推倒,可以去掉参数类型,多个参数不能去掉括号 ( )

在Android的按键就可以这么使用:

mButton.setOnClickListener((View v) -> {
    // do something here
});

学习视频参考:
https://www.bilibili.com/video/BV1V4411p7EF?p=10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值