全篇简介
这一篇想聊一下我认知到的Stream流,其实也是一种相对于之前版本简化代码量的方法,首先来做一个思考。
思考
如何筛选出列表中所有3的倍数
分析
以前的话我们基本上会采用一个for循环来实现这个操作
List<Integer> list = new ArrayList<>();
for (final Integer num : nums){
if (num % 3 == 0) {
list.add(num);
}
}
代码量虽然也不多但是仍然可以通过Stream流简化。
简化之后的代码:
List<Integer> list = nums.stream().filter(num -> num % 3 == 0).collect(Collectors.toList());
这行语句的含义是stream()操作将集合转换成一个流,再调用一个类似collect 的及早求值方法返回集合,使用filter过滤器来遍历数据并检查其中的元素,其中过滤的条件表达式用Lambda表达式书写。
变式
上面提到的这种用法是Stream流的其中一个常见用法,另一种常见用法是用到forEach
List<Integer> list = nums.stream().forEach(num -> System.out.println(num));
同样也是使用到了Lambda表达式,作用是输出集合中元素,式子里接收一个 Lambda 表达式。
方法
下面说说Stream流下的一些方法:
1.map
如果有一个函数可以将一种类型的值转换成另外一种类型。map 操作就可以使用该函数,将一个流中的值转换成一个新的流。
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class t2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("sdf");
list.add("a");
list.add("asdf");
list.add("d");
list.add("basdfgh");
List<String> list2 = list.stream()
.map((s) -> s.toUpperCase())
.collect(Collectors.toList());
list2.forEach(System.out :: println);
}
}
上述代码的作用就是转换元素由小写到大写。
它还有一个进阶版本的flatMap ,但是我还没弄明白,这里就先不介绍了
2.filter
这个方法在上面也用过了,大致的作用都是用于筛选的
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class t2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("sdf");
list.add("a");
list.add("asdf");
list.add("d");
list.add("basdfgh");
List<String> list2 = list.stream()
.filter((s) -> s.length() > 3)
.collect(Collectors.toList());
list2.forEach(System.out :: println);
}
}
上述代码的效果就是筛选字符长度大于3的元素。
其中还有limit等,都是在其筛选结果上做文章
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class t2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("sdf");
list.add("a");
list.add("asdf");
list.add("d");
list.add("basdfgh");
List<String> list2 = list.stream()
.filter((s) -> s.length() > 3)
.limit(2)
.collect(Collectors.toList());
list2.forEach(System.out :: println);
}
}
这样的操作就意味着它只会采集收集到的前面两个数据。
3.reduce
简单来说就是把Stream流中的不同元素归并为同一个元素,java8中它所支持的reduce方法主要有三种,简单区分就是可以分为一种参数,两种参数和三种参数的归并。我们这里介绍一种参数的归并。
package test;
import java.util.ArrayList;
import java.util.List;
public class t2 {
public static void main(String[] args) {
List<Long> list = new ArrayList<>();
for (long i = 1; i <= 100; i++) {
list.add(i);
}
Long sum = list.stream()
.filter(s -> s % 2==0)
.reduce(0L, (r, l) -> r + l);
System.out.println(sum);
}
}
上述代码的意思就是求0-100内所有偶数之和。
4.更多方法就不一一介绍了
总结
Stream流是一个非常值得开发的工具,与Lambda表达式相结合总能起到意想不到的作用,在实战中使用这样的工具能减少不少的代码量,今天我所学习的新特性就是Stream流中的这几个基础方法,还有很多更加便捷的方法还没了解。