Stream流中的常用方法_forEach与Stream流中的常用方法_filter

Stream流中的常用方法_forEach

常用方法

 

流模型 操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种

延迟方法∶返回值类型仍然是stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为延迟方法。)

 

终结方法∶返回值类型不再是 Stream接口自身类型的方法,因此不再支持类似strirgBuilder那样的链式调用。本小节中,终结方法包括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),意为消费一个指定泛型的数据。

package day01.Demo01_Day016;

import java.util.stream.Stream;

/*
         Stream流中的常用方法_forEach
    void forEach(Consumer<? super T> action);
    该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。
    Consumer接口是一个消费型的函数式接口,可以传递Lambda表达式,消费数据
    简单记:
        forEach方法,用来遍历流中的数据
        是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法
     */
public class Demo02Stream_forEach {
        public static void main(String[] args) {
            Stream<String> stream = Stream.of("莫凡", "王耀", "唐三", "萧炎", "龙星", "赵四");
            //使用Stream流中的方法forEach对Staream流中的数据进行遍历
           /*
            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或方法引用)作为筛选条件。

 

 此前我们已经学习过java.util.stream.Predicate 函数式接口,其中唯一的抽象方法为:

boolean test(T t);

该方法将会产生一个boolean值结果,代表指定的条件是否满足。如果结果为true,那么Stream流的filter 方法

将会留用元素;如果结果为false,那么filter 方法将会舍弃元素。

 1 package day01.Demo01_Day016;
 2 
 3 import javax.sound.midi.Soundbank;
 4 import java.util.stream.Stream;
 5 
 6 /*
 7         Stream流中的常用方法_filter:用于对Stream流中的数据进行过滤
 8     Stream<T> filter(Predicate<? super T> predicate);
 9     filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
10     Predicate中的抽象方法:
11         boolean test(T t);
12      */
13 public class Demo03Stream_filter {
14         public static void main(String[] args) {
15             Stream<String> stream = Stream.of("李靖", "王玄策", "王守仁", "王维", "李白");
16             //对Stream流中的元素进行过滤,只要姓王的人
17             Stream<String> stream1 = stream.filter((String name) -> {
18                 return name.startsWith("王");
19             });
20             stream1.forEach(name-> System.out.println(name));
21             /*
22             Stream流属于管道流,只能被消费(使用)一次
23             第一个Stream流调用完毕方法,数据就会流转到下一个Stream上
24             而这时第一个Stream流已经使用完毕,就会关闭了
25             所以第一个Stream流就不能再调用方法了
26             IllegalStateException: stream has already been operated upon or closed
27              */
28             stream.forEach(name-> System.out.println(name));
29 
30         }
31 }

 

 

 

posted @ 2022-10-11 16:36  zj勇敢飞,xx永相随  阅读(406)  评论(0编辑  收藏  举报