Stream流与数组集合的转换
java. util. stream. Stream是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)
获取一个流非常简单,有以下几种常用的方式:
所有的Collection集合都可以通过stream默认方法获取流;
default Stream stream ()。
Stream接口的静态方法of可以获取数组对应的流;
static Stream of (T… values)。
参数是一个可变参数,那么我们就可以传递一个数组。
以下则是集合与数组转变为流的方式:
public class StreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
Set<String> set = new HashSet<>();
Stream<String> s2 = set.stream();
Map<String,String> map = new HashMap<>();
//获取键,存储到- -个Set集合中
Set<String> keySet = map. keySet();
Stream<String> s3 = keySet.stream();
//获取值,存储到一-个Col lection集合中
Collection<String> values = map. values();
Stream s4 = values.stream();
//获取键值对(键与值的映射关系entrySet)
Set<Map. Entry<String,String>> entries = map.entrySet();
Stream<Map. Entry<String, String>> s5
= entries. stream();
//把数组转换为Stream流
Stream<Integer> s6 = Stream.of(1, 2, 3, 4, 5);
//可变参数传递数组
Integer[] arr = {1,2,3,4,5};
Stream<Integer> s7 = Stream.of(arr);
String[] arr2 = {"a","bb","CCC"};
Stream<String> s8 = Stream.of(arr2);
}
}
一次性消费方法forEach
Stream流中的常用方法_ forEach
void forEach(Consumer<? super T> action);
该方法接收- -个Consumer接口函数,会将每- -个流元素交给该函数进行处理。
Consumer接口是一个消费型的函数式接口,可以传递L ambda表达式,消费数据
简单记:
forEach方法,用来遍历流中的数据是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法
Stream流中的常用方法filter:
用于对Stream流中的数据进行过滤
Stream filter(Predicate<? super T> predicate);
filter方法的参数Predicate是一个函数式接口, 所以可以传递L ambda表达式,对数据进行过滤
Predicate中的抽象方法:
boolean test(T t);
Stream流属于管道流,只能被消费(使用)一次第一个Stream流调用完毕方法,数据就会流转到下一个Stream上而这时第一个Stream流 已经使用完毕,就会关闭了所以第-个Stream流就不能再调用方法了
public class Practice {
public static void main(String[] args) {
String[] a = {"大佬","二老","三老","四老","五老"};
Stream<String> s1 = Stream.of(a);
//s1.forEach((String name)->{System.out.print(name);});
s1.forEach((String name)->System.out.print(name+" "));
}
}
运行结果:
大佬 二老 三老 四老 五老
若“//s1.forEach((String name)->{System.out.print(name);});”这行没有给注释掉,即有两个forEach方法;运行结果则会报错,如下
大佬二老三老四老五老Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.base/java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
at cn.yunhe.weekend.Practice.main(Practice.java:10)
故forEach为Stream流中的最终方法即一次性方法。