Stream流思想
类似于电子厂的流水线作业。
从初始源头一步一步往下流,在往下流的过程中,每一个节点都进行一定的操作,最终完成这个产品的组装。
获取流
单列集合获取流:
直接调用集合的stream()方法。
数组获取流:
方法一:Stream.of(T… values)
方法二:Arrays里的静态方法
//单列集合获取流,直接调用其中的stream()方法
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream1 = list.stream();
System.out.println(Arrays.toString(stream1.toArray()));
//数组获取流
//方法一:Stream.of(T... values)
String[] strArr = {"xiao", "lao", "ben"};
Stream<String> stream2 = Stream.of(strArr);
System.out.println(Arrays.toString(stream2.toArray()));
//方法二:Arrays里的静态方法
Stream<String> stream3 = Arrays.stream(strArr);
System.out.println(Arrays.toString(stream3.toArray()));//[aa, bb, cc]
使用流
流内置六种方法,如下所示:
//forEach:遍历
@Test
public void forEach() {
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream = list.stream();
stream.forEach(s -> System.out.println(s));
}
//filter:过滤
@Test
public void filter() {
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream = list.stream();
Stream<String> stringStream = stream.filter(s -> s.length() > 3);
stringStream.forEach(s -> System.out.println(s));
}
//count:数数
@Test
public void count() {
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream = list.stream();
long count = stream.count();
System.out.println(count);
}
//limit:获取流中的前n个元素
@Test
public void limit() {
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream = list.stream();
Stream<String> limit = stream.limit(2);
limit.forEach(s -> System.out.println(s));
}
//skip:跳过流中的前n个元素
@Test
public void skip() {
List<String> list = new ArrayList<>();
list.add("xiao");
list.add("lao");
list.add("ben");
Stream<String> stream = list.stream();
Stream<String> limit = stream.skip(2);
limit.forEach(s -> System.out.println(s));
}
//concat:合并两个流
@Test
public void concat() {
Stream<String> stream1 = Stream.of("xiao");
Stream<String> stream2 = Stream.of("lao", "ben");
Stream<String> stream = Stream.concat(stream1, stream2);
stream.forEach(s -> System.out.println(s));
}
流的注意事项
1、流支持链式调用,但是只有返回结果是stream类型的才可以链式调用。forEach和count方法不可以链式调用。
2、Stream流只能一次性使用。这个流调用方法后,就死亡了,不可以继续调用别的,否则会报错。
java.lang.IllegalStateException:
stream has already been operated upon or closed