首页 / JAVA / Java8之Lambda表达式
Java8之Lambda表达式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java8之Lambda表达式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3319字,纯文字阅读大概需要5分钟。
内容图文
什么是Lambda表达式?
Lambda表达式是一个匿名函数,即没有函数名的函数。它用一个表达式提供了一个实现单个接口方法(函数式接口)的简洁明了的方式,经常被用作匿名内部类的替代。使用Lambda表达式可以写出更简洁灵活的代码。
在了解Lambda表达式之前,我们必须先了解函数式接口。
函数式接口可以理解为只有一个抽象方法的接口,例如:
|
其中@FunctionalInterface声明了该接口为函数式接口,若此时再添加一个抽象方法,将编译报错。
Lambda表达式依赖于函数式接口。
为什么使用Lambda表达式?
我们先来看下传统的匿名内部类,使用Comparator接口比较两个整数的大小:
public void test() { |
最关键的代码其实只有return Integer.compare(o1, o2);
这一句,用Lambda表达式进行改造:
public void test() { |
还可以再进一步简化:
public void test() { |
可见,使用Lambda表达式可以使代码变得非常简洁,提高可读性,是JDK8非常强大好用的特性,满分推荐!
Lambda表达式语法
参数列表 + 操作符(箭头操作符) + Lambda体,如:
语法格式
无参数,无返回值
() -> System.out.println("Hello");
有一个参数,无返回值
(a) -> System.out.println(a);
// a -> System.out.println(a);当只有一个参数时可以省略参数列表的小括号。同样,当Lambda体中只有一条语句时,return也可以省略。另外,参数列表中也不需写数据类型。这是因为JVM编译器会根据上下文进行类型推断。
有两个或以上参数,有返回值,同时Lambda体中有多条语句,此时Lambda体需用大括号
Comparator<Integer> comp = (o1, o2) -> {
System.out.println("比较两个整数大小");
return Integer.compare(o1, o2);
};
内置函数式接口
上文提到Lambda表达式依赖于函数式接口,不难理解,倘若一个接口中存在多个抽象方法,那么Lambda如何知道使用哪一个方法呢?这是不合理的。
函数式接口代表的一种契约, 一种对某个特定函数类型的契约。 在它出现的地方,实际期望一个符合契约要求的函数。 Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型,而这个目标类型就是某个函数式接口。
既然如此,使用Lambda表达式时我们就需要函数式接口这样一个目标类型,而JDK8内置了一些函数式接口,涵盖了绝大部分使用场景。通常在开发时,我们不需要自己定义函数式接口,直接使用JDK提供的就行了。JDK8内置了四大核心函数式接口。
我们可以根据不同的场景去选择使用哪一个接口。例如:
无返回值,此时可以选择消费型接口
public void test() {
printValue(8, (v) -> System.out.println("Value is " + v)); // Value is 8
}
// 打印参数值
public void printValue(int value, Consumer<Integer> con) {
con.accept(value);
}返回特定类型的对象,此时可以选择供给型接口
// Supplier<T> 供给型接口
public void test() {
int len = getStringLength(() -> (new String("Hello")));
System.out.println(len); // 5
}
public int getStringLength(Supplier<String> sup) {
return sup.get().length(); // 返回字符串的长度,sup.get()返回String类型的对象
}指定输入参数的类型,返回特定类型的结果,此时可以选择函数型接口
// Function<T, R> 函数型接口
public void test() {
Integer num = strToInt("888", (str) -> Integer.parseInt(str));
System.out.println(num instanceof Integer); // true
}
// 将字符串数值转换为Integer类型
public Integer strToInt(String s, Function<String, Integer> fun) {
return fun.apply(s);
}判断指定类型的对象是否满足某个条件,此时可以选择断言型接口
<t <a="" href="https://www.dazhuanlan.com">大专栏
内容总结
以上是互联网集市为您收集整理的Java8之Lambda表达式全部内容,希望文章能够帮你解决Java8之Lambda表达式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。