Bootstrap

Stream流

一 : Stream流的介绍

stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果;

stream不会改变数据源,通常情况下会产生一个新的集合;

stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。

stream操作分为终端操作和中间操作,那么这两者分别代表什么呢?
终端操作:会消费流,这种操作会产生一个结果的,如果一个流被消费过了,那它就不能被重用的。
中间操作:中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。一个特别需要注意的点是:中间操作不是立即发生的。相反,当在中间操作创建的新流上执行完终端操作后,中间操作指定的操作才会发生。所以中间操作是延迟发生的,中间操作的延迟行为主要是让流API能够更加高效地执行。

stream不可复用,对一个已经进行过终端操作的流再次调用,会抛出异常。

二 : 获取Stream流的方式

java.util.stream.Stream 是Java 8新加入的流接口。(并不是一个函数式接口
获取一个流非常简单,有以下几种常用的方式:

所有的 Collection 集合都可以通过 stream 默认方法获取流(顺序流);

所有的 Collection 集合都可以通过parallelStream获取并行流

Stream 接口的静态方法 of 可以获取数组对应的流。

Arrays的静态方法stream也可以获取流

Filter(过滤)

 filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。

 @Test
    public void filter() {
        List<String> list = Arrays.asList("name", "age", "password", "address");
        List<String> collect = list.stream().filter(item ->
                        item.length() > 4)
                .collect(Collectors.toList());
        System.out.println(collect);
        System.out.println(list);
    }

比如上面那个集合中的值那个的长度大于4

Map(转换)

 map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素到另一个元素。

 @Test
    public void map() {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> collect = numbers.stream().map(item -> {
            item *= 2;
            return item;
        }).collect(Collectors.toList());
        System.out.println(collect);
    }

比如,将上面的集合中的值每个*2

Distinct(去重)

 distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。

 @Test
    public void distinct() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> collect = list.stream().distinct().collect(Collectors.toList());
        System.out.println(collect);
    }

Limit(限制)

 limit()方法可以将流限制为指定的元素数

  @Test
    public void limit() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> collect = list.stream().limit(10).collect(Collectors.toList());
        System.out.println(collect);
    }

Skip(跳过)

 skip()方法可跳过前N个元素。

    @Test
    public void Skip(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> collect = list.stream().skip(10).collect(Collectors.toList());
        System.out.println(collect);
    }

forEach(循环)

 forEach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值。

   @Test
    public void forEach(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        list.stream().forEach(item->{
            System.out.println(item);
        });
   }

Count(计数)

 count()方法可以返回流中的元素数。

@Test
    public void  Count(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        long count = list.stream().count();
        System.out.println(count);
   }

;