【Java8新特性】Lambda表达式基础语法,都在这儿了!!-阿里云开发者社区

开发者社区> 优惠码优惠> 正文

【Java8新特性】Lambda表达式基础语法,都在这儿了!!

简介:
+关注继续查看

【Java8新特性】Lambda表达式基础语法,都在这儿了!!

写在前面
前面积极响应读者的需求,写了两篇Java新特性的文章。有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没问题!这不,Lambda表达式来了!

匿名类到Lambda表达式
我们先来看看从匿名类如何转换到Lambda表达式呢?

这里,我们可以使用两个示例来说明如何从匿名内部类转换为Lambda表达式。

匿名内部类到Lambda表达式
使用匿名内部类如下所示。

Runnable r = new Runnable(){

@Override
public void run(){
    System.out.println("Hello Lambda");
}

}
转化为Lambda表达式如下所示。

Runnable r = () -> System.out.println("Hello Lambda");
匿名内部类作为参数传递到Lambda表达式作为参数传递
使用匿名内部类作为参数如下所示。

TreeSet ts = new TreeSet<>(new Comparator(){

@Override
public int compare(Integer o1, Integer o2){
    return Integer.compare(o1, o2);
}

});
使用Lambda表达式作为参数如下所示。

TreeSet ts = new TreeSet<>(

(o1, o2) -> Integer.compare(o1, o2);

);
从直观上看,Lambda表达式要比常规的语法简洁的多。

Lambda表达式的语法
Lambda表达式在Java语言中引入了 “->” 操作符, “->” 操作符被称为Lambda表达式的操作符或者箭头操作符,它将Lambda表达式分为两部分:

左侧部分指定了Lambda表达式需要的所有参数。
Lambda表达式本质上是对接口的实现,Lambda表达式的参数列表本质上对应着接口中方法的参数列表。

右侧部分指定了Lambda体,即Lambda表达式要执行的功能。
Lambda体本质上就是接口方法具体实现的功能。

我们可以将Lambda表达式的语法总结如下。

1.语法格式一:无参,无返回值,Lambda体只有一条语句

Runnable r = () -> System.out.println("Hello Lambda");
具体示例如下所示。

@Test
public void test1(){

Runnable r = () -> System.out.println("Hello Lambda");
new Thread(r).start();

}
2.语法格式二:Lambda表达式需要一个参数,并且无返回值

Consumer func = (s) -> System.out.println(s);
具体示例如下所示。

@Test
public void test2(){

Consumer<String> consumer = (x) -> System.out.println(x);
consumer.accept("Hello Lambda");

}
3.语法格式三:Lambda只需要一个参数时,参数的小括号可以省略

Consumer func = s -> System.out.println(s);
具体示例如下所示。

@Test
public void test3(){

Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("Hello Lambda");

}
4.语法格式四:Lambda需要两个参数,并且有返回值

BinaryOperator bo = (a, b) -> {

System.out.println("函数式接口");
return a + b;

};
具体示例如下所示。

@Test
public void test4(){

Comparator<Integer> comparator = (x, y) -> {
    System.out.println("函数式接口");
    return Integer.compare(x, y);
};

}
5.语法格式五:当Lambda体只有一条语句时,return和大括号可以省略

BinaryOperator bo = (a, b) -> a + b;
具体示例如下所示。

@Test
public void test5(){

Comparator<Integer> comparator = (x, y) ->  Integer.compare(x, y);

}
6.语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”

BinaryOperator bo = (Integer a, Integer b) -> {

return a + b;

};
等同于

BinaryOperator bo = (a, b) -> {

return a + b;

};
上述 Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。

函数式接口
Lambda表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。

只包含一个抽象方法的接口,称为函数式接口。

可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。

可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。

我们可以自定义函数式接口,并使用Lambda表达式来实现相应的功能。

例如,使用函数式接口和Lambda表达式实现对字符串的处理功能。

首先,我们定义一个函数式接口MyFunc,如下所示。

@FunctionalInterface
public interface MyFunc {

public T getValue(T t);

}
接下来,我们定义一个操作字符串的方法,其中参数为MyFunc接口实例和需要转换的字符串。

public String handlerString(MyFunc myFunc, String str){

return myFunc.getValue(str);

}
接下来,我们对自定义的函数式接口进行测试,此时我们传递的函数式接口的参数为Lambda表达式,并且将字符串转化为大写。

@Test
public void test6(){

String str = handlerString((s) -> s.toUpperCase(), "binghe");
System.out.println(str);

}
运行test6方法,得出的结果信息如下所示。

BINGHE
我们也可以截取字符串的某一部分,如下所示。

@Test
public void test7(){

String str = handlerString((s) -> s.substring(0,4), "binghe");
System.out.println(str);

}
运行test7方法,得出的结果信息如下所示。

bing
可以看到,我们可以通过handlerString(MyFunc myFunc, String str)方法结合Lambda表达式对字符串进行任意操作。

注意:作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型 。

写在最后
如果觉得文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习Java8新特性。

最后,附上Java8新特性核心知识图,祝大家在学习Java8新特性时少走弯路。

原文地址https://www.cnblogs.com/binghe001/p/12834021.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ES9的新特性:正则表达式RegExp
正则表达式是我们做数据匹配的时候常用的一种工具,虽然正则表达式的语法并不复杂,但是如果多种语法组合起来会给人一种无从下手的感觉。 于是正则表达式成了程序员的噩梦。今天我们来看一下如何在ES9中玩转正则表达式
99 0
Java8 Lambda表达式详解手册及实例
Java8 Lambda表达式详解手册及实例
7 0
【译】Java 8的新特性—终极版
文/杜琪(简书作者) 原文链接:http://www.jianshu.com/p/5b800057f2d8 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中
3095 0
Java语法糖--Lambda表达式存在的意义
本文目录 1. Lambda表达式的本质 2. 语法 2.1 通过类实现加密 2.2 通过匿名内部类实现加密 2.3 通过Lambda表达式实现加密 2.4 Lambda表达式的简略写法 3. Lambda表达式存在的意义 4. 函数式接口
6 0
java8新特性中lambda表达式的使用(中)
最近工作中使用到了lambda表达式,不是很理解,就去学习了一下,通过了解发现真的特别好用。就像下面这样,几行代码完成了java8之前很多行才能完成的任务量。下面的代码是基于groovy语言实现的,这次主要通过举例总结一下java8中lambda的新特性,文章最后拿在公司一个业务场景进行实战,给小伙伴提供一个使用lambda表达式迅速解决现实问题的思路。
5 0
+关注
优惠码优惠
阿里云优惠码阿里云推荐券bieryun.com
203
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载