为什么scala不能接收元组作为函数参数?

文件netlog是个链接表,大概样子是:

12:34:56 1.1.1.1:2345 > 2.2.2.2:6789 UDP
12:34:57 1.1.1.1:2345 > 2.2.2.2:6789 UDP
12:34:58 1.1.1.1:2345 > 2.2.2.2:6789 UDP
...

r是正则表达式,t是找到的ip:

1.1.1.1:2345 > 2.2.2.2:6789
1.1.1.1:2345 > 2.2.2.2:6789
1.1.1.1:2345 > 2.2.2.2:6789
...

a是最后的结果,本来期待的是:

(("1.1.1.1:2345", "IN"), ("2.2.2.2:6789", "OUT"))
(("1.1.1.1:2345", "IN"), ("2.2.2.2:6789", "OUT"))
(("1.1.1.1:2345", "IN"), ("2.2.2.2:6789", "OUT"))
...

但是总是报错。

Note: Tuples cannot be directly destructured in method or function parameters.
      Either create a single parameter accepting the Tuple1,
      or consider a pattern matching anonymous function: `{ case (param1, param1) => ... }
        l.split(" > ") => ((_.head, "IN"), (_.last, "OUT")))
               ^

源代码如下:

    val fs = Source.formFile("netlog.txt")       //读取文件
    val r = """A regular expression here""".r    //正则表达式
    val t = fs.flatMap(l => r.findAllIn(l))      //分析文件
    val a = t.map(l => l.split(" > ") => ((_.head, "IN"), (_.last, "OUT")))
阅读 5.1k
2 个回答

Hi,报的错已经告诉你不能直接写tuple了啊

应该要用模式匹配啊

不知道你搞明白没,你可以把完整的代码贴出来,我给你纠正

val a = t.map(l => {val v = l.split(" > "); ((v.head, "IN"), (v.last, "OUT"))})

或者

val a = t.map(l => l.split(" > ")).map((_.head, "IN"), (_.last, "OUT"))

应该都可以啊,报的错是针对你那个写法的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进