首页 / 职场圈 / 正文
Java8新特性之Stream流,流与迭代器
阅读数:14058

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Java8新特征之Stream流,流与迭代器-1.jpg

恭喜你们,顿时就要学完Java8 Stream流的一整系列了,实在我相信Stream流对很多利用Java的同学来说,都是一个常识盲点,由于这个缘由,我才这么细致地讲授Stream流的各个常识点,经过这一全部系列,我相信只要认真看了的同学,都已把握的差不多了,就差实战了。实在我在工作进程中,Stream流对我的帮助真的挺大的,所以,我想和大师分享一下,因而这系列的文章就出来了。在本系列文章公布的时辰,有很多同学反应,Stream流的调试和forEach()的调试都不是出格友爱,那本篇给出一个折衷的调试方式,虽然不能完善处理调试的题目,可是根基上已经能处理绝大部分的调试题目了,没错,就是迭代器了,固然迭代器除了能帮助调试之外,他最重要的还是遍历功用。这篇文章除了先容传统的迭代器外,还会先容Java8中新增的Spliterator,由于在并行流的场所,Spliterator相当的好用。

我们先简单先容一下传统的迭代器

迭代器是实现了Iterator接口的工具,而且Iterator接口答应遍历,获得大概移除元素。

public interface Iterator<E> {

Iterator<T> iterator();

E next();

default void remove() {

throw new UnsupportedOperationException("remove");

}

default void forEachRemaining(Consumer<? super E> action) {

Objects.requireNonNull(action);

while (hasNext())

action.accept(next());

}

}

利用Iterator的一般步调:
    (1)经过iterator()方式,获得指向调集或流开首的迭代器。(2)建立一个hasNext()方式挪用循环,只要hasNext()返回true,就继续迭代。(3)在循环中,经过挪用next()方式获得每个元素。

private static void learnIterator() {

List<String> lists = Arrays.asList("A", "B", "C", "D");

Iterator<String> iterator = lists.stream().iterator();

while (iterator.hasNext()) {

System.out.println(iterator.next());

}

}

可是假如我们不点窜调集的情况下,利用forEach()实在加倍便当的,实在两种方式本质上面是一样的,在你编译以后,forEach()会转换成迭代器的方式停止操纵了。有了迭代器,相信调试就得方便起来了,即使不能间接调试,也可以经过迭代器,反推之前,能够发生了什么。

值得留意的一点是:Java8给根基范例的流供给了额外的迭代器:PrimitiveIterator.OfInt,PrimitiveIterator.OfDouble,PrimitiveIterator.OfLong,PrimitiveIterator,但这些接口都是来扩大自Iterator接口的,所以利用上面也是不异的。

Java8新特征之Stream流,流与迭代器-2.jpg

Spliterator

Spliterator是Java8新增的一种迭代器,这类迭代器由Spliterator接口界说,Spliterator也有普通的遍历元素功用,这一点与适才说的迭代器类似的,可是,可是Spliterator方式和利用迭代器的方式是分歧的。别的,它供给的功用要比Iterator多。终极要的一点,Spliterator支持并行迭代。

public interface Spliterator<T> {

boolean tryAdvance(Consumer<? super T> action);

int characteristics();

long estimateSize();

Spliterator<T> trySplit();

default void forEachRemaining(Consumer<? super T> action) {

do { } while (tryAdvance(action));

}

}

将Spliterator用于根基迭代使命是很是简单的,只需要挪用tryAdvance()方式,直至其返回false.假如要为序列中的每个元素利用不异的行动,那末forEachRemaining()供给了一种加倍高效的替换方式。对于这两个方式,在每次迭代中将发生的行动都由Consumer工具界说的操纵来决议,Consumer也是一个函数式接口,估量大师已经晓得怎样分析了,这里就不带大师分析了,他的行动是指定了在迭代中下一个元素上履行的操纵。下面来一个简单的例子:

private static void learnIterator() {

List<String> lists = Arrays.asList("A", "B", "C", "D");

Spliterator<String> spliterator = lists.stream().spliterator();

while (spliterator.tryAdvance(System.out::println));

}

利用forEachRemaining()方式改良这个例子:

private static void learnIterator() {

List<String> lists = Arrays.asList("A", "B", "C", "D");

lists.stream().spliterator().forEachRemaining(System.out::println);

}

留意,利用这个方式时,不需要供给一个循环来一次处置一个元素,而是将各个元素作为一个整体来看待,这是Spliterator的又一个上风。

Spliterator的另一个值得留意的方式是trySplit(),它将被迭代的元素分别红了两部分,返回其中一部分的新Spliterator,另一部分则经过本来的Spliterator拜候。下面再给一个简单的例子

private static void learnIterator() {

List<String> lists = Arrays.asList("A", "B", "C", "D");

Spliterator<String> spliterator = lists.stream().spliterator();

Spliterator<String> stringSpliterator = spliterator.trySplit();

if (stringSpliterator != null) stringSpliterator.forEachRemaining(System.out::println);

System.out.println("------------------");

spliterator.forEachRemaining(System.out::println);

}

打印的成果:

A

B

------------------

C

D

这里只是给大师供给了这类方式而已,例子自己没有什么寄义,可是当你对大数据集履行并行处置时,拆分能够是极有帮助的了。但更多情况下,要对流履行并行操纵时,利用其他某个Stream方式更好,而不必手动处置Spliterator的这些细节,Spliterator最合适的场景是,给定的一切方式都不能满足你的要求时,才斟酌。

总结

到这里,Java8 Stream流的常识,根基上已经先容完了,缩减操纵,并行流,映照,还有收集是Stream流的焦点内容,可是要想把握好这些内容,第二篇的根基常识你是跑不掉的,是以我的倡议还是老老实实,从第一篇起头认真看,看完这7篇文章,你根基已经很是系统地把握Java8的Stream流常识了,大师也不要忘记Collectors类,里面供给给我们的方式,根基上能处置各类百般的收集元素题目了,假如你从第一篇文章起头看,一向看到这里了,那你今后只管多利用Stream流来处置调集吧,只是学会这些常识是没有用的,要多在你们的项目中应用他们,这样才能加倍好地了解,假如大师在使有的进程中碰到什么样的题目,接待来这里面留言,我看到了,一定第一时候和大师一路摸索处理的方式。假如大师对我的文章感爱好的话,也可以关注一下,前面我估量会出一系列数据结构方面的文章,固然是Java的一全部系列数据结构啦。假如你感觉Stream流这系列文章,你们能看得比力

懂的话,那我相信数据结构系列的文章你们也会有一样的感受的,最初,感谢大师,祝你们技术越来越强,生活越来越愉快,最重要的还是顿时找到女朋友,哈哈哈哈。

Java8新特征之Stream流,流与迭代器-3.jpg


上一篇:当你欠债30万以上,一无一切的时辰,你会怎样办?
下一篇:二级建造师报名前换了工作单元,工作证实怎样开?
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过甚至封号 圈友联系仅限于好向圈APP进行及时沟通咨询 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#调试, #迭代器, #stream, #系列, #介绍
条评论
您需要登录后才可以回帖 登录 | 立即注册
飞翔的呵呵哒 发表于 2020-6-9 22:36:13 | 阅读全部
都10几了
使用道具 举报
回复
侵权投诉可通过好向圈APP举报投诉----社区技术支持:泰帮动力 江苏好向圈信息科技有限公司 网站地图1 网站地图2