java8新特性Stream流中的filter skip limit distinct方法学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012934325/article/details/87274645

今天看了一下Java8中的新特性,流,java.util.stream。下面主要说Stream类中的四个方法,分别是filter,limit,skip,distinct。

distinct方法API解释

/**
  * 返回一个流,该流是由当前流中的元素通过Object类的equals方法比较后得到不同的元素所组成。
  * 对于有序的流,不同的元素的选择是稳定的,对于重复的元素,元素第一次被遇到的就会被保存。
  * 对于无序的流,没有稳定性保证。
  * 这是一个有状态的中间操作。
  * 在并行管道中使用distinct(),保证稳定性是相当搞的代价,并且稳定性经常不被需要。
  * 如果你的情景下语义是允许的,使用一个无序的流源(比如generate(Supplier))或者移除有序的约束(使用unordered())
  * 或许在并行管道中使用distinct()可以有更好有效执行效率。
  * 如果顺序保持一致,并且你正在并行管道使用distinct()经历极差的性能和内存利用率,转向使用(sequential())顺序执行
  * 或许可以提高性能。
  * @return 一个新的流
  */
 Stream<T> distinct();

limit方法API解释:

/**
  * 返回一个流,该流是由当前流的元素组成,当前流的截断长度不会超过maxSize。
  * 这是一种短路状态中间操作。
  * 一般来说limit()在顺序流管道上的操作是一种廉价的操作,在有序的并行管道上来说是非常高代价的操作。
  * 尤其是对于maxSize的值很大的时候,因为limit(n)被认为不仅仅是返回n个元素,而是在遇到的顺序中的前n个元素。
  * 如果你的情形中语义是允许的,可以使用一个无序的流源(比如使用generate(Supplier))或者移除有序的约束(使用unordered())
  * 或许可以在并行管道流中使用limit使得速度得到明显的提高。
  * 如果遇到的顺序需要保持一致,并且你在并行管道中使用limit(),正在经历极差的性能或者内存利用率,转向使用sequential()顺序执行
  * 或许可以提高性能。
  * @param maxSize 流中的元素的个数被限制的最大的数值。
  * @return 新的流the new stream
  * @throws 如果maxSize是负数,则抛出IllegalArgumentException异常
  */
 Stream<T> limit(long maxSize);

skip方法API解释:

/**
  * 返回一个流,该流是由排除该流的前n个元素后剩下的元素组成的。
  * 这是一个有状态的中间操作。
  * 一般来说skip()是一个廉价的操作应用于序列流的管道,它在有序的并行的管道上的代价是很高的。
  * 尤其是对于n的值很大的时候,因为skip(n)被认为不仅仅是跳过n个元素,但是前n个元素处于遭遇的顺序。
  * 如果你的情况中语义是允许的,使用一个无序的流源(例如使用generate(Supplier))或者移除排序约束(使用unordered()),
  * 这样的结果在并行管道中使用skip()速度会有明显的提高。
  * 如果保持一致的遇到顺序是被需要的,并且你正在经历着极差的性能或者内存利用率在并行管道中使用skip(),
  * 转向顺序执行(使用sequential())或许可以提高性能。
  * @param n  表示要越过的元素的个数。
  * @return 返回一个新的流对象
  * @throws 如果n是负数会抛出IllegalArgumentException异常
  */
 Stream<T> skip(long n);

filter方法API解释:

 /**
 * 返回一个流,该流中包含了与给定谓词所匹配的元素.
  * 这是一个中间操作。
  * @param predicate 是一个不干扰,无状态的谓词应用于每个元素来确定是否它应该被包含
  * @return 返回一个新的流对象
  */
 Stream<T> filter(Predicate<? super T> predicate);

代码操作:

package com.java8.learn;

import java.util.Arrays;
import java.util.List;

/**
 *@author:liyongyong
 *@description: Stream流中filter,skip,limit,distinct方法学习
 *@date 2019/2/14
 */
public class FilterStream {
    public static void main(String[] args){
        //打印出集合中的偶数
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8);
        list.stream().filter(num->num%2==0).forEach(System.out::println);
        //打印集合中的字符串,去掉重复的字符串
        List<String> string = Arrays.asList("abc","happy","hello","world","abc","hello");
        string.stream().distinct().forEach(System.out::print );
        //打印集合跳过前两个的前三个元素
        List<Integer> list1 = Arrays.asList(1,2,3,4,5,6,7,8);
        list1.stream().skip(2).limit(3).forEach(System.out::print);
    }
}

结果如下:

2
4
6
8
abchappyhelloworld345

猜你喜欢

转载自blog.csdn.net/u012934325/article/details/87274645