【问题标题】:Finding all pairs of two collections that match a predicate using functional style in Scala [closed]在Scala中使用函数样式查找与谓词匹配的所有两个集合对[关闭]
【发布时间】:2020-07-22 03:53:30
【问题描述】:

我目前正在学习 Scala,我正在寻找充分利用函数式编程风格的好方法。

我正在尝试执行以下操作:

给定两个集合,我想列出与谓词匹配的两个条目的所有可能组合。

现在我可以使用两个循环来解决它并将每个结果保存在一个新集合中,但是有没有更优雅的 scala-ey 解决方案?

【问题讨论】:

  • 欢迎您!请提供您迄今为止尝试过的解决方案。双循环一,也许你在“功能”风格中所做的任何其他事情。
  • 是的,flatMapfilter 应该可以解决问题。您甚至可以使用 for comprehension 使其更具可读性。试一试,如果有任何问题,请返回。
  • 你可以从欧拉项目或九十九个问题及解决方案入手。在这里您可以找到更多关于它们的信息:pavelfatin.com/ninety-ninepavelfatin.com/scala-for-project-euler

标签: scala scala-collections


【解决方案1】:

你可以开始

val col1: List[Int]
val col2: List[Int]

col1.map { i =>
  col2.map { j =>
    (i -> j)
  }.filter { case (i, j) =>
   // condition
  }
}.flatten

mapflatten 一开始应该是最容易理解的。尝试一下查看类型的想法。

那么你可以尝试用flatMap(f)替换map(f).flatten

col1.flatMap { i =>
  col2.map { j =>
    (i -> j)
  }.filter { case (i, j) =>
   // condition
  }
}

这与理解几乎相同:

for {
  i <- col1
  j <- col2
  ij = (i, j)
  if condition(ij)
} yield ij

这可能更容易阅读

for {
  i <- col1
  j <- col2
  if condition(i, j)
} yield (i, j)

https://scalafiddle.io/sf/mhFZMjt/0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2012-03-22
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多