【问题标题】:Combining 2 lists with streams in Groovy在 Groovy 中将 2 个列表与流结合起来
【发布时间】:2019-06-19 18:57:43
【问题描述】:

假设我有两个大小相等的列表 [1, 2, 3, 4, ...] 和 [a, b, c, d, ...]。有没有一种方法可以在不使用 lambda 函数或嵌套函数的情况下使用将 1 映射到 a、2 到 b、3 到 c 等等的流制作映射?

我会使用 map 并传入一个函数,但是这个传入的函数只能接受 1 个参数,并且我需要两条信息才能将元素相互映射。

IntStream(1, list1.size()).stream().map(this.&combineListsFunction).collect...

combineListsFunction 只能使用流中的信息,但我需要这两个列表才能使函数工作。

【问题讨论】:

  • 在 Guava、StreamEx 和其他可能的库中有一个 zip 方法用于在 Java 中连接两个流

标签: groovy functional-programming


【解决方案1】:

您可以转置这两个列表(这将为您提供一个元组列表,然后使用 collectEntries() 从中创建映射(正是这样)。例如:

def l1 = [1,2,3]
def l2 = ["a","b","c"]

assert [(1): "a", (2): "b", (3): "c"] == [l1,l2].transpose().collectEntries()

【讨论】:

  • 有没有更通用的方法来解决使用map但传入的函数需要多条信息的问题?我简化了我的实际问题,但没想到简化后的问题会有自己的具体答案。
  • AFAIK 没有。 map 采用 Function ,因此您必须提供一个带有一个参数的函数,例如一个列表并解构你自己。或者你从外部捕获一些东西(提供一个闭包来映射。例如stackoverflow.com/questions/49388245/…)。或者去寻找丢失的zip函数stackoverflow.com/questions/17640754/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多