版权声明:本文为博主原创文章,未经博主允许不得转载。 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