目录
一,lambda表达式语法
1,lambda初体验
维基百科上对于”Lambda expression”的解释:
来个例子,对一个list进行排序,可以看到现在变的非常简单
List<String> lists = new ArrayList();
lists.add("a");
lists.add("b");
lists.add("c");
lists.add("d");
Collections.sort(lists,(o1,o2) -> o1.compareTo(o2));
再来个例子,实现效果就是大写字符变小写
List<String> lists = new ArrayList();
lists.add("ZhangSan");
lists.add("LiSi");
List<String> lowercaseLists = lists.stream().map((String name) -> {return name.toLowerCase();}).collect(collectors.toList());
在java8之前,同样的效果需要这样操作,明显步骤繁琐。
List<String> lists = new ArrayList();
lists.add("ZhangSan");
lists.add("LiSi");
List<String> lowercaseLists =new ArrayList();
for(String name :lists){
lowercaseLists.add(name.toLowerCase());
}
2,lambda语法
lambda的一般语法
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
其实,参数类型,编译器可以推断出来,所以可以如下:
(param1, param2, ..., paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
这样那个字符转小写的就可以变成下面这样。只有一个参数的时候,小括号也可以去掉
List<String> lowercaseLists = lists.stream().map(name -> {return name.toLowerCase();}).collect(collectors.toList());
同样的也可以使用Method Reference,更简洁了
List<String> lowercaseLists = lists.stream().map(String::toLowerCase).collect(collectors.toList());
3,lambda访问外部数据
lambda也可以访问外部数据,可以看到,它访问到了i这个变量
//Lists,Strings是Guava中的一个工具类
String[] array = {"a", "b", "c"};
for(Integer i : Lists.newArrayList(1,2,3)){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}
而且这个i是不可变的。比如下面,这个就报错了。因为i变了,引用变了。
//Lists,Strings是Guava中的一个工具类
String[] array = {"a", "b", "c"};
for(int i = 1; i<4; i++){
Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}
4,Method reference和construct reference
方法引用
方法引用语法格式有以下三种:
objectName::instanceMethod
ClassName::staticMethod
ClassName::instanceMethod
前两种方式类似,比如System.out::println等同于x->System.out.println(x);Math::max等同于(x, y)->Math.max(x,y)。
最后一种方式,比如String::toLowerCase等同于x->x.toLowerCase()。
构造器引用
构造器引用语法如下:ClassName::new,把lambda表达式的参数当成ClassName构造器的参数 。例如BigDecimal::new等同于x->new BigDecimal(x)。
二,Stream语法
1. Stream初体验
定义:A sequence of elements supporting sequential and parallel aggregate operations.
解释:
Stream是元素的集合,这点让Stream看起来用些类似Iterator;
可以支持顺序和并行的对原Stream进行汇聚的操作;
来个例子,求list中不为null的个数
//Lists是Guava中的一个工具类
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
nums.stream().filter(num -> num != null).count();
stream通用语法
2. 转换stream
1,distinct: 对于Stream中包含的元素进行去重操作
2, filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;
3,map: 对于Stream中包含的元素使用给定的转换函数进行转换操作
4,flatMap:和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中;
5,生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
6, limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
7,skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;