Java8中Stream中的limit方法调用原理是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8中Stream中的limit方法调用原理是啥?相关的知识,希望对你有一定的参考价值。

Stream是一个接口,而Stream<T> limit(long maxSize);方法并非静态方法,为什么可以直接调用呢?如以下代码:
public class Demo
public static void main(String[] args)

String[] arr = "张三","李四","王五";
Stream<String> stream = Stream.of(arr);
Stream<String> stream1 = stream.limit(2);


仔细看以下两行代码:

Stream<String> stream = Stream.of(arr);
Stream<String> stream1 = stream.limit(2);
调用limit的是小写的stream,它是of方法返回的Stream的一个实例。追问

这个limit方法是抽象方法,为什么不用重写这个方法也能调用呢?找来找去都没找到limit的源码在哪。

追答

of方法是Java的很多接口或抽象类中存在的一种方法,叫工厂方法,专门生产对象的方法,此方法中封装了对系统的默认实现类的构造函数的调用。

追问

还是没搞懂,为啥像Stream类里的limit、forEach等方法,都是抽象方法,都没有方法体,可为什么调用的时候又能实现我们想要的功能?

追答

继承,接口,重写这些概念懂吗?如果这些概念不懂,这段代码是不可能看懂的。把接口和重写这两个概念真正搞明白了,就懂了。

追问

这些懂的,主要是抽象方法不是需要重写才能用吗,而我去Stream类里看了limit跟forEach方法,都是抽象方法。
limit方法:Stream limit(long maxSize);
forEach方法:void forEach(Consumer action);
而调用这两个方法时却不用重写也能实现功能,所以就整不明白了,这两个方法到底是怎么实现的?

追答

你的代码里是of方法,不是forEach方法。

追问

呃,现在不讨论我问题里的代码,就单独说limit方法吧,Stream limit(long maxSize); ,这是如何实现传递一个long类型的参数就能返回指定长度的数据呢?这limit方法并没有方法体呀?

参考技术A limit 返回 Stream 的前面 n 个元素追问

limit方法不是一个抽象方法吗,为什么能够直接调用,他是怎么实现的?

参考技术B Stream上的所有操作分为两类:中间操作和结束操作,中间操作只是一种标记,只有结束操作才会触发实际计算。中间操作又可以分为无状态的(Stateless)和有状态的(Stateful),无状态中间操作是指元素的处理不受前面元素的影响,而有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态操作,在读取所有元素之前并不能确定排序结果;结束操作又可以分为短路操作和非短路操作,短路操作是指不用处理全部元素就可以返回结果,比如找到第一个满足条件的元素。之所以要进行如此精细的划分,是因为底层对每一种情况的处理方式不同。

以上是关于Java8中Stream中的limit方法调用原理是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java8中Stream类中的forEach是抽象方法,为啥在调用的时候不用重写该方法就能实现遍历?

java8 stream limit distinct map flatMap

Java8 中的 Stream 那么强大,那你知道它的原理是什么吗?

Java8 Stream流使用及其基本原理

乐字节-Java8新特性-接口默认方法之Stream流(下)

Java8新特性----Stream