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:输出流的前三个,
@Test
public 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,则都不会输出
@Test
public 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:将两个流合并
@Test
public 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:去重
@Test
public 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方法
@Override
public 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);
}
@Override
public int hashCode() {
return Objects.hash(id, courseName);
}
sorted():排序
sorted()是有状态方法,对流中的元素进行排序,支持自然排序和比较器排序,建议使用比较器排序。(自然排序和比较器排序知识请参考TreeMap知识点)
Stream<T> sorted(Comparator<? super T> comparator);
示例5,排序
@Test
public 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);
}