您的位置:首页 > 文旅 > 美景 > Android使用Java 8新特性Lambda表达式

Android使用Java 8新特性Lambda表达式

2024/10/6 2:20:52 来源:https://blog.csdn.net/m0_63526467/article/details/141922767  浏览:    关键词:Android使用Java 8新特性Lambda表达式

Android使用Java 8新特性Lambda表达式

Java 8中着实引入了一些非常有特色的功能,如Lambda表达式、stream API、接口默认实现,等等。虽说我们本地安装的JDK就是Java 8的版本,不过本书中却一直没有使用过任何Java 8的新特性。这主要是因为我考虑到你对Java 8的新语法规则可能并不熟悉,如果直接应用到项目中的话,容易让代码难以理解,因此这里我就准备单独使用一节的篇幅来对Java 8的新特性进行讲解。

虽然刚才已经提到了几个Java 8中的新特性,不过现在能够立即应用到项目当中的也就只有Lambda表达式而已,因为stream API和接口默认实现等特性都只支持Android 7.0及以上的系统,

我们显然不可能为了使用这些新特性而放弃兼容众多低版本的Android手机。而Lambda表达式却最低兼容到Android 2.3系统,基本上可以算是覆盖所有的Android手机了,那么本节中我们就来重点学习一下Java 8中的Lambda表达式。

Lambda表达式本质上是一种匿名方法,它既没有方法名,也即没有访问修饰符和返回值类型,使用它来编写代码将会更加简洁,也更加易读。

如果想要在Android项目中使用Lambda表达式或者Java 8的其他新特性,首先我们需要在app/build.gradle中添加如下配置:

android {
...
defaultConfig {
...
jackOptions.enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}

之后就可以开始使用Lambda表达式来编写代码了,比如说传统情况下开启一个子线程的写法如下:

new Thread(new Runnable() {
@Override
public void run() {
//处理具体的逻辑
}
}).start();

而使用Lambda表达式则可以这样写:

new Thread(() -> {
//处理具体的逻辑
}).start();

是不是很神奇?不管是从代码行数上还是缩进结构上来看, Lambda表达式的写法明显要更加精简。

那么为什么我们可以使用这么神奇的写法呢?这是因为Thread类的构造函数接收的参数是一个Runnable接口,并且该接口中只有一个待实现方法。我们查看一下Runnable接口的源码,如下所示:

public interface Runnable {
/**
* Starts executing the active part of the class' code. This method is
* called when a thread is started that has been created with a class which
* implements {@code Runnable}.
*/
public void run();
}

凡是这种只有一个待实现方法的接口,都可以使用Lambda表达式的写法。比如说,通常创建一个类似于上述接口的匿名类实现需要这样写:

Runnable runnable = new Runnable() {
@Override
public void run() {
//添加具体的实现
}
};

而有了Lambda表达式之后我们就可以这样写了:

Runnable runnable1 = () -> {
//添加具体的实现
};

了解了Lambda表达式的基本写法,接下来我们尝试自定义一个接口,然后再使用Lambda表达式的方式进行实现。

新建一个MyListener接口,代码如下所示:

public interface MyListener {
String doSomething(String a, int b);
}

MyListener接口中也只有一个待实现方法,这和Runnable接口的结构是基本一致的。唯一不同的是,MyListener中的doSomething()方法是有参数并且有返回值的,那么我们就来看一看这种情况下该如何使用Lambda表达式进行实现。

其实写法也是比较相似的,使用Lambda表达式创建MyListener接口的匿名实现写法如下:

MyListener listener = (String a, int b) -> {
String result = a + b;
return result;
};

可以看到,doSomething()方法的参数直接写在括号里面就可以了,而返回值则仍然像往常一样,写在具体实现的最后一行即可

另外,Java还可以根据上下文自动推断出Lambda表达式中的参数类型,因此上面的代码也可以简化成如下写法:

MyListener listener = (a, b) -> {
String result = a + b;
return result;
};

Java将会自动推断出参数a是String类型,参数b是int类型,从而使得我们的代码变得更加精简了。

接下来举个具体的例子,比如说现在有一个方法是接收MyListener参数的,如下所示:

public void hello(MyListener listener) {
String a = "Hello Lambda";
int b = 1024;
String result = listener.doSomething(a, b);
Log.d("TAG", result);
}

我们在调用hello()这个方法的时候就可以这样写:

hello((a, b) -> {
String result = a + b;
return result;
});

那么doSomething()方法就会将a和b两个参数进行相加,从而最终的打印结果就会是“Hello Lambda1024 ”。现在你已经将Lambda表达式的写法基本都掌握了,接下来我们看一看在Android当中有哪些常用的功能是可以使用Lambda表达式进行替换的。

其实只要是符合接口中只有一个待实现方法这个规则的功能,都是可以使用Lambda表达式来编写的。除了刚才举例说明的开启子线程之外,还有像设置点击事件之类的功能也是非常适合使用Lambda表达式的。

传统情况下,我们给一个按钮设置点击事件需要这样写:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//处理点击事件
}
});

而使用Lambda表达式之后,就可以将代码简化成这个样子了:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener((v) -> {
//处理点击事件
});

另外,当接口的待实现方法有且只有一个参数的时候,我们还可以进一步简化,将参数外面的括号去掉,如下所示:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(v -> {
//处理点击事件
});

这样我们就将Lambda表达式的主要内容都掌握了。当然,有些人可能并不喜欢Lambda表达式这种极简主义的写法。不管你喜欢与否,Java 8对于哪一种写法都是完全支持的,至于到底要不要使用Lambda表达式其实全凭个人,多一种选择总归不是一件坏事情。

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com