使用stream流的好处
stream流是从jdk8之后才有的,其功能是对数组/列表中的元素进行操作,再此之前这个任务都是使用foreach来完成的,stream代替foreach的一个重要原因就是简洁
如
int[] list={1,2,3,4,5,6,7,8,9};
//打印这个数组中大于4的数字
使用foreach来完成这个任务
public class sudent {
public static void main(String[] args) {
int[] list={1,2,3,4,5,6,7,8,9};
for (int i : list) {
if (i>4){
System.out.println(i);
}
}
}
}
使用stream流来完成这个任务
public class sudent {
public static void main(String[] args) {
Stream.of(1,2,3,4,5,6,7,8,9).filter(i->i>4).forEach(System.out::println);
}
}
加粗样式## 创建stream流对象
- 使用stream中的静态方法of(将数组转成stream)
public static<T> Stream<T> of(T... values)
- collection接口中的stream方法
default Stream<E> stream()
stream中的的方法
-
延迟方法
- filter(),参数为predicate函数接口,可以通过lambda传递,其中test方法接收这个流中的元素,返回boolean类型的值,如果方法返回是false该元素就会被过滤
- map(),参数是function函数接口,接收流中的元素,返回任何类型的值
- limit(),接收一个long类型的数n,只要前n个元素
- skip(),接收一个long类型的数n,跳过前n个元素
- concat(),将两个stream流合并再一次,返回一个新的流
-
终结方法
- forEach(), 方法接收一个consumer的函数式接口,返回值为void,方法的一般写对元素的使用
- count(), 方法返回流中的所有元素的个数
用表格的形式
一个流只能使用一次,如
public class sudent {
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1, 2, 34, 4);
Stream<Integer> stream2 = stream.filter(integer -> integer > 4);
System.out.println(stream.count());
}
}
其中stream先是调用了filer方法将流中小于等于4的元素过滤掉,然后第二次调用的方法count,就会报一个IllegalStateException异常
stream中方法实现的细节
先看下面这段代码
import java.util.stream.Stream;
public class sudent {
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1, 2,3,4,5,6,7,8,9);
Stream<Integer> stream1 = stream.filter(i -> {
System.out.println("我是:"+i+"这是第一个filter");
return i > 2;//过滤掉小于等于2的元素
});
Stream<Integer> stream2 = stream1.filter(i -> {
System.out.println("我是:"+i+"这是第二个filter");
return i > 4;//过滤掉小于等于4的元素
});
stream2.forEach(System.out::println);//传递方法,打印剩下的元素
}
}
猜测程序是所有元素执行完了第一个filter方法后在执行第二filter方法
还是对第一个元素执行完了第一个filter方法在对其执行第二个filter方法在在执行foreach方法(假设这个元素可以通过第一个和第二个filter方法)
结果为
我是:1这是第一个filter
我是:2这是第一个filter
我是:3这是第一个filter
我是:3这是第二个filter
我是:4这是第一个filter
我是:4这是第二个filter
我是:5这是第一个filter
我是:5这是第二个filter
5
我是:6这是第一个filter
我是:6这是第二个filter
6
我是:7这是第一个filter
我是:7这是第二个filter
7
我是:8这是第一个filter
我是:8这是第二个filter
8
我是:9这是第一个filter
我是:9这是第二个filter
9
如果是第一种结果就应该是:
上面全是:我是:*这是第一个filter
中间是: 我是:*这是第二个filter
最后是:数字
而这个结果显然是符合第二种猜想的
可以看作:一条流水线上同时只有一个产品,等这个产品制作完成,或是被淘汰才会开始制作下一个产品