二 lambda表达式(函数式接口)
1:lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。
2: lambda表达式配合Java8新特性Stream API可以将业务功能通过函数式编程简洁的实现.
3: lambda表达式语法:
一般语法:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; //............. return statmentM; }
单参数语法:
param1 -> { statment1; statment2; //............. return statmentM; }
单语句写法: 可以省略大括号、return和语句结尾的分号
param1 -> statment
方法引用写法:
Class or instance :: method
4:lambda表达式中的this概念
在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象
5:lambad表达式语法糖
execStrs.forEach(System.out::println);
6:System.out::println等同于x->System.out.println(x);
Math::max等同于(x, y)->Math.max(x,y)
String::toLowerCase等同于x->x.toLowerCase()
BigDecimal::new等同于x->new BigDecimal(x)
7:stream语法
两句话理解Stream:
A.Stream是元素的集合,这点让Stream看起来用些类似Iterator;
B.可以支持顺序和并行的对原Stream进行汇聚的操作;
包装后的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,
具体这些操作如何应用到每个元素上,就给Stream就好了!原先是人告诉计算机一步一步怎么做,现在是告诉计算机做什么,计算机自己决定怎么做。
当然这个“怎么做”还是比较弱的。
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
nums.stream().filter(num -> num != null).count();
上面这段代码是获取一个List中,元素不为null的个数。这段代码虽然很简短,但是却是一个很好的入门级别的例子来体现如何使用Stream,正所谓“麻雀虽小五脏 俱全”。我们现在开始深入解刨这个例子,完成以后你可能可以基本掌握Stream的用法!
图片就是对于Stream例子的一个解析,可以很清楚的看见:原本一条语句被三种颜色的框分割成了三个部分。红色框中的语句是一个Stream的生命开始的地 方,负责创建一个Stream实例;绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream;蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种 算法来汇聚成一个值,例子中是获取Stream中包含的元素个数。
使用Stream的基本步骤:
A.创建Stream;
B.转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(**可以有多次转换**);
B.对Stream进行聚合(Reduce)操作,获取想要的结果;
8: 如何得到stream呢:
8.1 使用stream的静态方法:
Stream<Integer> integerStream = Stream.of(1, 2, 3, 5);
Stream<String> stringStream = Stream.of("taobao");
8.2 generator方法:
Stream.generate(new Supplier<Double>() {
@Override
public Double get() {
return Math.random();
}
});
Stream.generate(() -> Math.random());
Stream.generate(Math::random);
8.3 iterator方法:
Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
8.4 通过Collection子类获取Stream(最常用)
9 转换Stream(这里列出常用的一些方法):
distinct:(去重,去重的逻辑依赖于元素的equals方法)
filter:
map:对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。
这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。
这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,
这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗。
flatMap:flatMap 把 input Stream 中的层级结构扁平化,就是将最底层元素抽出来放到一起。
Stream<List<Integer>> inputStream = Stream.of(
Arrays.asList(1),
Arrays.asList(2, 3),
Arrays.asList(4, 5, 6)
);
Stream<Integer> outputStream = inputStream.
flatMap((childList) -> childList.stream());
outputStream.forEach(x->System.out.print(x)); // 123456
limit: 截断
skip:
10 待续