Lambda表达式的使用

对于jdk1.8其实并不是那么熟悉,但是要学习这一点,对以后工作有好处,接下来开始学习jdk1.8在Android studio的配置以及lambda表达式的使用吧。

Lambda表达式

jdk1.8中新增的核心特性有lambda表达式,函数式接口,流API,默认方法,新的Date,以及Time API。详细介绍请看这里: Java 8简明教程 。

下面给大家介绍的是Lambda表达式,该表达式允许我们把行为传到函数里。之前把行为传到函数里我们采用的是匿名内部类,该方法导致行为最重要的方法夹杂在中间,不够突出,详见举例中代码。

lambda表达式取代了匿名内部类,取消了模板,允许程序猿用函数式风格编写代码,使代码可读性更高,尽管刚开始你会看不懂,但是你应该尝试,毕竟这是新的东西,我已从中获益。

格式

基本格式是:() -> {}

有下面三种具体表达:

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> {statement}

这个新的特性是激动人心的,那么有个问题,怎么用,是啊,很多东西我们都懂,但为什么还是过不好这一生,说远了,问题的关键是:用,得用,你还得会用。

lambda使用举例

as里的配置

要使用lambda,首先必须配置编译环境,这里使用的android studio,as默认的jdk版本是1.6,修改成1.8即可使用,这里确保你系统安装了jdk1.8,否则需要用到下面插件: gradle-retrolambda

as里的配置有两种方法:

配置gradle脚本

在build.gradle脚本中添加下列代码:

android {
   compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
   }
}

当然写成下面的样子也是可以的

android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}

设置项目结构

按快捷键Ctrl+Shift+Alt+S进入项目结构设置,把app的jdk版本修改成1.8,注意你需要填写1.8,因为那个下拉菜单里没有这一选项,如下:

这里采用的是第二种方法,然后项目自动同步。

同步后是会在build.gradle脚本下生成和上面一样的东东:

举例

点击按钮触发事件

传统的点击事件,应用匿名内部类:

Button button = (Button) findViewById(R.id.btn_insert);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show();
        }
    });

通过上面设置jdk版本为1.8后,鼠标放到new View.OnClickListener()里会有下面提示:

然后我们按快捷键Alt+Enter,是这样的

继续回车后,见证奇迹的时刻到来lo。。。

使用lambda表达式之后是这样的

Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());

一行代码就搞定了,清晰可见,把行为传到了函数里,这里注意v不可省略,是函数onClick的参数,当然就可以是任意名字,我还是建议就用一个字母表示,简单嘛,当然了首先你得知道她的意思,尽管她的很多行为你始终不会明白,哈哈。

实现Runnable接口

传统实现Runnable接口是这样的:

new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", "haha");
    }
}).start();

使用lambda表达式之后是这样的:

new Thread(() -> {
    Log.i("TAG", "haha");
}).start();

哇哦,是不是有种很清爽的感觉,乍一看,这是什么鬼,仔细分析后是用了lambda表达式() -> {},哈哈,简单的爱,这是程序员懒惰的一种体现,可以写出更简洁高校的代码,赞一个。

比较

既然lambda表达式即将正式取代Java代码中的匿名内部类,那么有必要对二者做一个比较分析。

第一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。

第二是编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。

总结

lambda表达式还有很多用法,比如迭代器,详细用法请参考这里: Java8 lambda表达式10个示例

好了,希望你们喜欢!!!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你想要在某个地方定义一个简短的匿名函数时,可以使用C++中的lambda达式lambda达式是C++11引入的一种特性,它允许你在需要函数对象的地方定义一个函数,而不必显式地创建一个函数对象。 下面是一个lambda达式的基本语法: ``` [capture](parameters) -> return_type { // 函数体 } ``` - `capture`:捕获列,用于指定lambda达式可以访问的外部变量。可以为空`[]`,示不捕获任何外部变量;可以使用`[var]`来捕获一个变量;可以使用`[var1, var2]`来捕获多个变量。也可以使用`[=]`来按值捕获所有外部变量,或者使用`[&]`来按引用捕获所有外部变量。 - `parameters`:参数列,与函数的参数列类似。可以省略参数列,如果不需要参数的话。 - `return_type`:返回类型,用于指定lambda达式的返回类型。可以省略返回类型,编译器会根据函数体自动推断返回类型。 下面是一个简单的例子,演示了如何使用lambda达式来对一个整数数组进行排序: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> nums = {2, 4, 1, 3}; // 使用lambda达式排序 std::sort(nums.begin(), nums.end(), [](int a, int b) { return a < b; }); // 输出排序后的结果 for (int num : nums) { std::cout << num << " "; } return 0; } ``` 输出结果为:1 2 3 4 在这个例子中,lambda达式被用作`std::sort`函数的第三个参数,用于指定排序的规则。lambda达式捕获了外部变量`a`和`b`,并根据它们的大小关系来确定排序顺序。 希望这个例子可以帮助你理解lambda达式使用。如果还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值