流模型的操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种:
延迟方法:返回值类型仍然是Stream 接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方
法均为延迟方法)
终结方法:返回值类型不再是Stream 接口自身类型的方法,因此不再支持类似StringBuilder 那样的链式调
用。本小节中,终结方法包括count 和forEach 方法。
逐一处理:forEach
虽然方法名字叫forEach ,但是与for循环中的“for-each”昵称不同
void forEach(Consumer<? super T> action);
该方法接收一个Consumer 接口函数,会将每一个流元素交给该函数进行处理
复习Consumer接口
java.util.function.Consumer<T>接口是一个消费型接口。
Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据
/**
* Stream流中的常用方法_forEach
* void forEach(Consumer<? super T> action);
* 该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。
* Consumer接口是一个消费型的函数式接口,可以传递Lambda表达式,消费数据
*
* 简单记:
* forEach方法,用来遍历流中的数据
* 是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法
*/
public class Demo02Stream_forEach {
public static void main(String[] args) {
//获取一个Stream流
Stream<String>stream=Stream.of("张三","李四","王五","薛强");
//使用Stream流中的方法forEach对Stream流中的数据进行遍历
/* stream.forEach((String name)->{
System.out.println(name);
});*/
stream.forEach(name-> System.out.println(name));
}
}
过滤:filter
可以通过filter 方法将一个流转换成另一个子集流。方法签名:
Stream<T> filter(Predicate<? super T> predicate);
该接口接收一个Predicate 函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件
复习Predicate接口
此前我们已经学习过java.util.stream.Predicate 函数式接口,其中唯一的抽象方法为:
boolean test(T t);
该方法将会产生一个boolean值结果,代表指定的条件是否满足。如果结果为true,那么Stream流的filter 方法
将会留用元素;如果结果为false,那么filter 方法将会舍弃元素
/**
* Stream流中的常用方法_filter:用于对Stream流中的数据进行过滤
* Stream<T> filter(Predicate<? super T> predicate);
* filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
* Predicate中的抽象方法:
* boolean test(T t);
*/
public class Demo03Stream_filter {
public static void main(String[] args) {
//创建一个Stream流
Stream<String> stream = Stream.of("张三丰", "武媚娘", "王昭君", "妲己");
//对Stream流中的元素进行过滤,只要姓张的人
Stream<String> stream2 = stream.filter((String name) -> {
return name.startsWith("张");
});
//遍历stream2流
stream2.forEach(name-> System.out.println(name));
/**
* Stream流的特点:只能使用一次
*
* Stream流属于管道流,只能被消费(使用)一次
* 第一个Stream流调用完毕方法,数据就会流转到下一个Stream上
* 而这时第一个Stream流已经使用完毕,就会关闭了
* 所以第一个Stream流就不能再调用方法了
* IllegalStateException: stream has already been operated upon or closed
*/
stream.forEach(name-> System.out.println(name));
}
}