Stream流中的常用方法
- 延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(处终结方法外,其余方法均为延迟方法)
- 终结方法:返回值类型不再是Steam接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。本小节中,
终结方法包括 count 和 forEach 方法。
逐一处理:forEach
虽然方法名字叫 forEach,但是与for循环中的for-each昵称不同
void forEach(Consumer<? super T> action);
复习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 Demo3Stream_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> prediate);
该接口接收一个predicate函数式接口参数(可以是一个Lambde或方法引用)作为筛选条件
复习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 Demo4Stream_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)); } }