文章目录
前言
在这之前,看了好多关于Lambda文章。说实话,看过之后,基本,没看懂。在知乎中,看到大佬讲的,通俗易懂。我们在学习的过程中,尽量找一些技巧去理解问题,把复杂变简单,才是最好的方法。
什么是Lambda
先说一说常识: 我们可以把一个 值 赋给一个java变量
int a = 2;
String me = "I LOVE YOU";
上面没有异议吧,继续。有时候,一个 值 不太够,想把 一段代码拿过来用怎么办?
即 Lambda 的作用就是把 一块代码 赋给一个变量。
具体操作步骤:
这就是一个Lambda的表达式
Lambda表达式有什么用?
最直观的作用就是使得代码变得异常简洁
再来看一些实例:
Runnable run = () -> System.out.println("Hello World");// 1
ActionListener listener = event -> System.out.println("button clicked");// 2
Runnable multiLine = () -> {// 3
System.out.println("Hello ");
System.out.println("World");
};
BinaryOperator<Long> add = (Long x, Long y) -> x + y;// 4
BinaryOperator<Long> addImplicit = (x, y) -> x + y;// 5
得出的结论:
- Lambda表达式是有类型的,赋值操作的左边就是类型。
- Lambda表达式的类型实际上是对应接口的类型。Lambda表达式可以包含多行代码,需要用大括号把代码块括起来,就像写函数体那样。
- 大多数时候,Lambda表达式的参数表可以省略类型,就像代码2和5那样。这得益于javac的类型推导机制,编译器可以根据上下文推导出类型信息。
Lambda表达式和Stream
Stream就是一组元素的序列,支持对这些元素进行各种操作,而这些操作是通过Lambda表达式指定的。可以把Stream看作Java Collection的一种视图,就像迭代器是容器的一种视图那样(但Stream不会修改容器中的内容)
**实例 **
假设需要从一个字符串列表中选出以数字开头的字符串并输出 java7
List<String> list = Arrays.asList("1one", "two", "three", "4four");
for(String str : list){
if(Character.isDigit(str.charAt(0))){
System.out.println(str);
}
}
java 8
List<String> list = Arrays.asList("1one", "two", "three", "4four");
list.stream()// 1.得到容器的Steam
.filter(str -> Character.isDigit(str.charAt(0)))// 2.选出以数字开头的字符串
.forEach(str -> System.out.println(str));// 3.输出字符串
Stream有两个明显的好处:
-
减少了模板代码,只用Lambda表达式指明所需操作,代码语义更加明确、便于阅读。
-
将外部迭代改成了Stream的内部迭代,方便了JVM本身对迭代过程做优化(比如可以并行迭代)。
参考文章:
java Lambda初探