Stream应用(四)——终止操作:查找与匹配

四、终止操作:查找与匹配

终端操作会从通道流的流水线生成结果。其结果可以是任何不是流的值,例如int、List、void等。如果流操作后返回的值还是Stream流类型的,则是开始操作和中间操作。
有以下经常用到的查找与匹配操作:

        allMatch——检查是否匹配所有元素
        anyMatch——检查是否至少匹配一个元素
        noneMatch——检查是否没有匹配的元素
        findFirst——返回第一个元素
        findAny——返回当前流中的任意元素
        count——返回流中元素的总个数
        max——返回流中最大值
        min——返回流中最小值

下面进行示例演示,首先创建数据源为

    private static List usrs = Arrays.asList(
            new User("lzj", 20),
            new User("zhangsan", 22),
            new User("lisi", 25),
            new User("suner", 30));

1、 allMatch——检查是否匹配所有元素
检查是否流中的所有User对象的年龄是否大于18.

@Test
    public void test1(){
        Boolean flag = usrs.stream()
            .allMatch((x) -> x.getAge() > 18);
        System.out.println(flag);   //输出true
    }

2、 anyMatch——检查是否至少匹配一个元素
检查是否流中的User对象有没有年龄大于25岁的。

@Test
    public void test2(){
        Boolean flag = usrs.stream()
                .anyMatch((x) -> x.getAge() > 25);
        System.out.println(flag);   //输出true
    }

3、 noneMatch——检查是否没有匹配的元素
检查流中是否User类型的对象年龄都不大于35岁。

@Test
    public void test3(){
        Boolean flag = usrs.stream()
                .noneMatch((x) -> x.getAge() > 35);
        System.out.println(flag); //输出true
    }

4、 findFirst——返回第一个元素
或得满足条件的流中的第一个元素并放到Optional容器中。

@Test
    public void test4(){
        Optional user = usrs.stream()
            .filter((x) -> x.getName().contains("s"))
            .findFirst();
        System.out.println(user.get());//输出:User [name=zhangsan, age=22]
    }

5、 findAny——返回当前流中的任意元素
过滤出姓名包含s字符的User类型对象,获取满足条件的任何一个对象,并放到Optional容器中。

@Test
    public void test5(){
        Optional user = usrs.stream()
            .filter((x) -> x.getName().contains("s"))
            .findAny();
        System.out.println(user.get());//输出:User [name=zhangsan, age=22]
    }

6、 count——返回流中元素的总个数
过滤出名字包含s字符的所有User类型对象,并返回总个数。

@Test
    public void test6(){
        Long total = usrs.stream()
                .filter((x) -> x.getName().contains("s"))
                .count();
        System.out.println(total);
    }

7、 max——返回流中最大值
获取年龄最大的那个User类型对象,并放到Optional容器中

@Test
    public void test7(){
        Optional user = usrs.stream()
            .max((x, y) -> x.getAge().compareTo(y.getAge()));
        System.out.println(user);
    }

8、 min——返回流中最小值
获取年龄最小的User类型对象,并放置到Optional容器中

@Test
    public void test8(){
        Optional user = usrs.stream()
                .min((x, y) -> x.getAge().compareTo(y.getAge()));
        System.out.println(user);
    }

五、终止操作:归约

reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。
获取流中User对象年龄的总和。

    /*reduce*/
    @Test
    public void test9(){
        Integer total = usrs.stream()
            .map(User::getAge)
            .reduce(0, (x, y) -> x + y);
           /*其中0、x、y和total的类型一致,都是Integer类型*/
System.out.println(total);//输出:97
    }

开始流中放置的是每个user对象,经过map后,把每个user对象的年龄获取到放在流中,然后分别把年龄进行加起来,起始值是0,加总后的结果放在赋给total变量。

五、终止操作:收集

collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法。
获取流中User类型对象的年龄,并把年龄重组成List类型

    @Test
    public void test10(){
        List names = usrs.stream()
            .map(User::getName)
            .collect(Collectors.toList());
        System.out.println(names);
    }

运行方法,输出结果:

[lzj, zhangsan, lisi, suner]

你可能感兴趣的:(java笔记,java,stream)