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

Java从流中收集连续对

穆乐逸
2023-03-14
问题内容

鉴于流,例如{ 0, 1, 2, 3, 4 }

如何最优雅地将其转换为给定形式:

{ new Pair(0, 1), new Pair(1, 2), new Pair(2, 3), new Pair(3, 4) }

(当然,假设我已经定义了Pair类)?

编辑:这不严格有关整数或原始流。对于任何类型的流,答案应该是通用的。


问题答案:

我的StreamEx库扩展了标准流,它pairMap为所有流类型提供了一种方法。对于原始流,它不会更改流类型,但可用于进行一些计算。最常见的用法是计算差异:

int[] pairwiseDiffs = IntStreamEx.of(input).pairMap((a, b) -> (b-a)).toArray();

对于对象流,你可以创建任何其他对象类型。我的库没有提供任何新的用户可见的数据结构Pair(这是库概念的一部分)。但是,如果你有自己的Pair类并想使用它,则可以执行以下操作:

Stream<Pair> pairs = IntStreamEx.of(input).boxed().pairMap(Pair::new);

或者,如果你已经有一些Stream:

Stream<Pair> pairs = StreamEx.of(stream).pairMap(Pair::new);

此功能是使用自定义分隔符实现的。它的开销很低,可以很好地并行化。当然,它可以与任何流源一起使用,而不仅仅是像许多其他解决方案一样随机访问列表/数组。在许多测试中,它的表现都非常好。这是一个JMH基准,我们可以使用不同的方法找到所有输入值在一个较大值之前的值(请参阅此问题)。



 类似资料:
  • 给定诸如之类的流, 我怎样才能最优雅地将它转换成给定的形式: (当然,假设我定义了类对)? 编辑:这不是严格的关于int或基元流。对于任何类型的流,答案都应该是通用的。

  • 我有一个列表,我想用流过滤,抓取前10个,并显示给用户。按下按钮后..我想从那个位置继续流。 但问题是,这里我不得不在第一个10+多个不匹配的过滤器上运行过滤器(再次)。

  • 问题内容: 我想接受输入并对其应用并行流,然后我希望将输出作为列表。输入可以是任何列表或可以对其应用流的任何集合。 我在这里担心的是,如果我们要输出为map,我们可以从java中选择一个选项,例如 但是我看不到以线程安全的方式从并行流收集以提供列表作为输出的选项。我看到那里还有一个选择 通过这种方式,我们可以在collect方法中提供各种并发实现。但是我认为java.util.concurrent

  • 我有一个嵌套的映射,其中key是员工名称,values是另一个映射,其中key是公司名称,value是经验年数,如下所示 现在我的函数应该返回一个映射,以员工姓名为键,以总经验为值。我如何使用java流(在单个流中)做到这一点

  • 为了更好地理解新的流API,我试图转换一些旧代码,但我被困在这一个。 我似乎无法为它创建有效的收集器:

  • 我想获取地图的值,找到min值,并为地图的每个条目构造一个新的CodesWitMinValue实例。我希望使用Java11个流,我可以在多行中使用多个流(一个用于min值,一个用于转换)来实现这一点。是否可以使用java 11流和收集器在单行中实现?谢谢。