Java8 --- lambda表达式
1. 什么是lambda表达式?
官方解释:一个不用背绑定到一个标识符上,并且可能被调用的函数。
其他解释:一段带有输入参数的执行代码块。
2. 怎么用?
public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.compareToIgnoreCase(o2); } });
treeSet.add("fangxiaobai"); treeSet.add("wangsu"); treeSet.add("fanghengyu");
TreeSet<String> treeSet1 = new TreeSet <>(( o1, o2) -> o1.compareToIgnoreCase(o2) );
treeSet1.add("fangxiaobai"); treeSet1.add("wangsu"); treeSet1.add("fanghengyu");
System.out.println(treeSet); System.out.println(treeSet1); } |
输出结果是:
[fanghengyu, fangxiaobai, wangsu] [fanghengyu, fangxiaobai, wangsu] |
为什么?
Java8的lambda表达式给我提供了创建SAM(Single Abstract Method)接口更加简单的语法糖。
1. 语法详解:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; //............. return statmentM; } |
这种是最全的一种。由于编译器可以帮我推断出参数累型,所以我们可以去掉参数类型。
(param1,param2, ..., paramN) -> { statment1; statment2; //............. return statmentM; } |
当只有一个形参的时候,还可以省略小括号。
param1 -> { statment1; statment2; //............. return statmentM; } |
当lambda表达式只有一条语句的时候,还可以省略大括号。
param1 -> statment |
还可以使用Method Reference。
List<String> names = new ArrayList <>(); names.add("Fangxiaobai"); names.add("FangHengyu"); names.add("WangSu"); List<String> lowercaseName = names.stream().map(String::toLowerCase).collect(Collectors.toList()); System.out.println(lowercaseName); |
上面这个程序的输出结果是:
[fangxiaobai, fanghengyu, wangsu] |
以上的例子中,都是在演示lambda的基本用法。替换接口的匿名实现类。而Method Reference的这个例子中还演示了stream的一种用法。
下面来演示一下:使用lambda表达式来访问外部的对象。---捕获(capture)
//demo3 ArrayList <String> arrayList = new ArrayList <>(); arrayList.add(" xiaobai "); arrayList.add(" susu "); for(String s : arrayList) { Stream.of(arrayList).map(item->s.length()+" ").forEach(System.out::print); Stream.of(arrayList).map(item->s.trim()).forEach(System.out::println); } |
输出结果:
9 xiaobai //后面没有空格了! 7 susu //后面没有空格了! |
解释一下:
记得以前使用匿名内部类的时候,内部类可以引用外类的变量,但是变量必须是final类型。Lambda也是这样,不过lambda是隐式将其当成final类型了。
但是,如果你在lambda表达式中使用了基本数据类型,那就会报错了。自己可以试一下。
据说这是java8的一个小优化,将引用类型隐式的声明为final。
2. 方法引用:
objectName::instanceNameè System.out::println 相当于 x->Sout(x)
ClassName:staticMethodNameè Math:max 相当于Math.max(x,y)
ClassName:instanceNameè String::toLowerCase 相当于 x->x.tolowerCase();
3. 构造器引用
ClassName::new èBigDecimal::new 相当于 x->new BigDecimal();
好了 lambda表达式就是这些。。。
二、Stream
Stream 在java中的定义是:
A sequence of elements supporting sequentialand parallel aggregate operations.
1. Stream 是元素的集合,
2. 可以支持顺序和并行的对员Stream进行聚合的操作。
可以把Stream当做是一个高级版本的Iterator,它可以对其包含的元素什么操作,比”过滤掉长度大于10的字符串”,”获取每个字符串的首字母”。
List<Integer> nums = new ArrayList(); nums.add(1); nums.add(2); nums.add(3); nums.add(null); nums.add(4); nums.add(null); long count = nums.stream().filter(num -> num != null).count(); System.out.println(count); |
输出结果:
4 |
最后
如果你觉得写的还不错,就关注下公众号呗,关注后,有点小礼物回赠给你。
你可以获得5000+电子书,java,springCloud,adroid,python等各种视频教程,IT类经典书籍,各种软件的安装及破解教程。
希望一块学习,一块进步!