Java 8新特性 Lambde表达式介绍-使用

Lambde表达式干什么用的?
  一种简写的格式, 类似于for循环和增强for循环关系,最直观的好处简写代码,以前要占四五行代码,现在可能只需要用一行代码就搞定了

        ArrayList<String> list = new ArrayList<>();
        //普通for 循环
        for (int index = 0; index < list.size(); index++) {
            ......
        }

        //增强for 循环
        for (String string : list) {
            ......
        }

下面是示例代码 和详细解析

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //示例代码1:重写的方法不带参数
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "run: ");
            }
        });
        new Thread(() -> Log.i(TAG, "onCreate: "));
        new Thread(() -> {Log.i(TAG, "onCreate: ");});


        //示例代码2:重写的方法带一个参数
        Button button = new Button(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(TAG, "onClick: ");
            }
        });
        button.setOnClickListener(v -> Log.i(TAG, "onCreate: "));
        button.setOnClickListener((v) -> {Log.i(TAG, "onCreate: ");});
        button.setOnClickListener((View v) -> {Log.i(TAG, "onCreate: ");});


        //示例代码三:重写的方法带多个参数,并带有返回值
        File file = new File("");
        file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String filename) {
                return filename.endsWith(".png");
            }
        });
        file.list((dir, filename) -> filename.endsWith(".png"));
        file.list((File dir, String filename) -> {return filename.endsWith(".png");});
        file.list((File dir, String filename) -> {
            Log.i(TAG, "onCreate: ");
            return filename.endsWith(".png");
        });
    }

Lambde表达式分两部内容: “->”的左侧和右侧

如下图:
这里写图片描述

“->”左边表达式,相当于重写方法里面的参数,有三种情况:

  • 重写的方法没有参数时,用()表示;上面的实例代码1
  • 有一个参数时,表示方式有下面三种:上面的实例代码2
    • v :变量名;可以是任意自定义的,当然最好和类型、具体参数意义相关
    • (v):括号包裹变量名;
    • (View v):括号里面数据类型加上变量名
  • 重写的方法里面有多个参数,表示方式:上面的实例代码3
    • (dir, filename):括号包裹变量名,变量名可任意自定义,各个变量之间有逗号隔开
    • (File dir, String filename):在上面的基础上给变量加上数据类型

“->”右边表达式,相当于自己重写方法里面的具体内容,有两种情况:

  • 重写的方法表达式只有一句话时,分两种情况:
    • 返回值为void:示例代码1
      • Log.i(TAG, “onCreate: “):直接写上这句话,并省略分号;
      • {Log.i(TAG, “onCreate: “);}:用大括号包裹,并且有语句结束符号分号
    • 返回值为非void:示例代码3
      • filename.endsWith(“.png”):直接写上这句话,并省略分号;
      • {return filename.endsWith(“.png”);}:用大括号包裹,并且有语句结束符号分号,语句前面必须加上return关键字;
  • 重写的方法表示式有多句话时:示例代码3
    • {Log.i(TAG, “onCreate: “);return filename.endsWith(“.png”);}:大括号包裹多条语句,每句话都必须有结束符号分号;如果返回值类型为非void,必须有return结束语句;如果返回值为void,可以省略return 语句;

PS: Lambde表达式只支持重写一个方法的, 如果你重写的方法有多个, 不好意思, 不支持

问题来了,既然这么多表示方式,到底用那种呢?

  快捷键提示就知道了, 应该是最简洁的: 如果左侧只有一个参数, 那么就可以省略小括号和参数类型; 如果右侧只有一句话, 就可以省略大括号和分号
  
Android Studio提示快捷键: 快捷键Ctrl + Shift + 空格
这里写图片描述

在Android Studio上面用法:
问题是Android Studio 2.1版本以前不支持Lambde表达式,解决办法:传送门 gradle-retrolambda

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值