当前位置: 首页 > 面试题库 >

了解Java 8中的Spliterator,Collector和Stream

茅才
2023-03-14
问题内容

我在理解StreamJava
8中的接口时遇到了麻烦,尤其是在与Spliteratorand
Collector接口有关的地方。我的问题是我根本无法理解SpliteratorCollector接口的是,作为一个结果,Stream接口仍然有些模糊了我。

Spliterator和和到底是什么Collector,我如何使用它们?如果我愿意写我自己SpliteratorCollector(和可能是我自己Stream在这个过程中),我应该怎样做和不能做?

我阅读了一些分散在网络上的示例,但是由于此处的所有内容仍然是新内容并且随时可能更改,因此示例和教程仍然非常稀疏。


问题答案:

几乎可以肯定,您永远不必以Spliterator用户身份进行处理。如果你在写它时,才需要Collection类型的自己,
打算并行优化他们的操作。

就其价值而言,a
Spliterator是一种操作集合中元素的方法,可以很容易地拆分出集合的一部分,例如,因为您要并行化并希望一个线程在集合的一部分上工作,一个线程在另一部分上工作,等等。

从本质上讲,您也绝对不应将类型的值保存Stream到变量中。
Stream有点像Iterator,因为它是一次性对象,您几乎总是在流畅的链中使用它,如Javadoc示例:

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();

Collector是map / reduce的“
reduce”操作的最通用,抽象的版本;特别是,它需要支持并行化和完成步骤。的示例Collector包括:

  • 求和,例如 Collectors.reducing(0, (x, y) -> x + y)
  • StringBuilder追加,例如 Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString)


 类似资料:
  • 为了试图深入理解Java流和spliterator,我有一些关于spliterator特性的微妙问题: Q1:与(不带参数的stream.of()) :已沉降,大小 :沉降的、不可变的、有大小的、有序的 为什么不具有相同的特性?请注意,当它与stream.concat()结合使用时(特别是没有)会产生影响。我想说不仅应该具有不可变和有序性,而且还应该具有DISTINCT和nonnull。只有一个参

  • 问题内容: 我知道如何从-> “转换”一个简单的Java ,即: 现在,我想对地图进行基本相同的操作,即: 解决方案不应限于-> 。就像上面的示例一样,我想调用任何方法(或构造函数)。 问题答案: 它不如列表代码那么好。您不能在通话中构造new ,因此工作会混入通话中。

  • 我希望得到以下内容:,然后:。因为我们首先遍历1到20之间的所有数字,所以只筛选出那些可被3除的数字,然后遍历这个新的并找到那些可被5除的数字。 但相反,我得到了以下输出: 它看起来没有检查所有的数字。此外,它看起来只检查可被3除的数字。

  • 本文向大家介绍深入了解java8的foreach循环,包括了深入了解java8的foreach循环的使用技巧和注意事项,需要的朋友参考一下 虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>。因为学习了Java8,所以只要能用到的地方都会去用,尤其是Java8的Stream,感觉用起来觉得很方便,因为点点点就出来了,而且

  • 我知道如何从->“转换”一个简单的Java,即: 现在我想用一张地图做基本相同的操作,即: 解决方案不应局限于->。就像上面的示例一样,我希望调用任何方法(或构造函数)。

  • 我不明白action.accept(val)是做什么的,我已经搜索过了,我知道必须这样做,只是不知道为什么。 下面是一个我不明白的简单示例: 例如,在这段代码中,我理解我们有一个消费者,它从一个源(在本例中是spliterator)消费每个元素,每个元素都必须被动作接受。所以在我看来,操作是cache.add(val)和变量index的增量,我不明白为什么最后一行(action.accept(va