Java------Stream流式编程常用API【limit,skip,concat,distinct,sorted】(四)
这篇文章讲:limit、skip、concat、distinct、corted五个流的中间操作的基础API。
limit():截取
截取流的前几个元素,方法原型如下:
Stream<T> limit(long maxSize);
limit()方法实现截取流的前n个元素组成一个新流,n小于元素个数则截取n个元素,n大于等于元素个数则取整个集合它是一个有状态方法。
示例1:输出流的前三个,
@Testpublic void test1() {List<StringBuffer> strs = new ArrayList<>();strs.add(new StringBuffer("hello"));strs.add(new StringBuffer("world"));strs.add(new StringBuffer("hi"));strs.add(new StringBuffer("com"));strs.add(new StringBuffer("student"));//如果输入limit大于n个元素,则会全部输出strs.stream().limit(3).forEach(System.out::println);}
skip():跳过
skip()跳过n个元素,剩余元素组成一个新流,如果n大于等于集合个数则生成一个空流。
Stream<T> skip(long n);
示例2:只输出最后两个,此时limit大于5,则都不会输出
@Testpublic void test1() {List<StringBuffer> strs = new ArrayList<>();strs.add(new StringBuffer("hello"));strs.add(new StringBuffer("world"));strs.add(new StringBuffer("hi"));strs.add(new StringBuffer("com"));strs.add(new StringBuffer("student"));strs.stream().skip(3).forEach(System.out::println);}
concat():截取
concat()方法合并两个流组成一个新流,API如下:
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
从API可以开出待合并的两个流的元素类型是相同的。
示例3:将两个流合并
@Testpublic void test1() {List<StringBuffer> strs = new ArrayList<>();strs.add(new StringBuffer("hello"));strs.add(new StringBuffer("world"));strs.add(new StringBuffer("hi"));strs.add(new StringBuffer("com"));strs.add(new StringBuffer("student"));List<StringBuffer> strs2 = new ArrayList<>();strs2.add(new StringBuffer("hello"));strs2.add(new StringBuffer("world"));strs2.add(new StringBuffer("hi"));strs2.add(new StringBuffer("com"));strs2.add(new StringBuffer("student"));Stream.concat(strs.stream(),strs2.stream()).forEach(System.out::println);}
多个流合并,只需要嵌套调用Steam.concat方法即可。
Stream.concat(strs.stream(),Stream.concat(strs2.stream(),strs3.stream())).forEach(System.out::println);
distinct():去重
distinct()去重方法,对流的元素进行去重操作,使用equals()、hashCode()方法判断元素是否相等,重复的元素则放弃,它是一个有状态方法。
Stream<T> distinct();
示例4:去重
@Testpublic void test1() {List<String> strs = new ArrayList<>();strs.add("hello");strs.add("hello");strs.add("hi");strs.add("hi");strs.add("student");strs.stream().distinct().forEach(System.out::println);}
如果去重实体类,则需要重写equals方法,以及hsahCode方法
@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;PbCourse pbCourse = (PbCourse) o;return id == pbCourse.id &&Objects.equals(courseName, pbCourse.courseName);}@Overridepublic int hashCode() {return Objects.hash(id, courseName);}
sorted():排序
sorted()是有状态方法,对流中的元素进行排序,支持自然排序和比较器排序,建议使用比较器排序。(自然排序和比较器排序知识请参考TreeMap知识点)
Stream<T> sorted(Comparator<? super T> comparator);
示例5,排序
@Testpublic void test1() {List<String> strs = new ArrayList<>();strs.add("hello");strs.add("world");strs.add("hi");strs.add("com");strs.add("student");//x1的长度大于2x的长度,strs.stream().sorted((x1,x2)->x1.length()-x2.length()).forEach(System.out::println);}