【问题标题】:How to map() method output and not the method itself?如何映射()方法输出而不是方法本身?
【发布时间】:2019-12-17 13:43:26
【问题描述】:

我是 Scala 新手,我创建了一个无限 Streamint,并希望为每个 int i 创建一个 map(),计算值 x,这是由方法 m(i) = x 产生的。关键是,我希望流在x > 0 时真正停止,并且我需要用于计算列表中最高xi。但是我正在努力完成这项任务,因为我收到了UnsupportedOperationException empty.max...

我尝试使用下面的代码,抛出所描述的异常。我还尝试从(i,m(i)) 创建元组,但实际上并没有应用m(i),而是方法本身被映射了。

这是方法m

    def m(t: Int): Double = {
      //Some calculation...
    }

Ant 我尝试了这些选项:

Stream.from(1).map(m(_)).takeWhile(_ > 0).toList.max
Stream.from(1).map((_,m(_))).takeWhile(_._2.apply(1) > 0).maxBy(_._2)

第二个显示:

missing parameter type for expanded function ((x$2: <error>) => m(x$2)) Stream.from(1).map((_,m(_))).takeWhile(_._2.apply(1) > 0).maxBy(_._2)

我怎样才能尽可能短地解决这个问题?非常感谢你们!

【问题讨论】:

  • 试试Stream.from(1).map(i => i -> m(i)).takeWhile(_._2 > 0).maxBy(_._2)._._1 如果你得到一个 UnsupportedOperationException empty.max 是因为你的流是空的,这意味着没有一个元素满足takeWhile 谓词,请确保你的逻辑是正确的。
  • 非常感谢@LuisMiguelMejíaSuárez,您的解决方案是正确的。但是我无法将评论标记为已接受的答案,对此感到抱歉

标签: scala functional-programming stream


【解决方案1】:
.map((_,m(_)))

这意味着i => (i, j => m(j)),而不是您想要的i => (i, m(i))。因此,只需明确写 map(i => (i, m(i)))(或 Luis 建议的 i -> m(i))。对于这个 lambda,我个人更喜欢大括号:map { i => (i, m(i)) }

【讨论】:

  • 非常感谢,是的,两种解决方案都有效,非常感谢!但是,为什么我的表达意思是 thisi => (i, j => m(j)) ?你能帮我解释一下吗?
  • @kitaird 是因为_去糖的方式(见仁见智,我尽量避免。因为它给我带来了很多困惑)_ 表示该直接范围内的 lambda,因此 map((_,m(_))) 表示 map(x1 => (x1, x2 => m(x2))) 因为嵌套。此外,_ 永远不会两次引用同一个参数,它只能用于一次。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2017-10-12
  • 2012-11-04
  • 2015-12-05
  • 2013-08-12
相关资源
最近更新 更多