Java------Stream流式编程常用API【limit,skip,concat,distinct,sorted】(四)

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);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值