在迭代器列表上对此flatMap进行Lazify

noa*_*hlz 2 scala lazy-evaluation

鉴于此功能,我无法修改:

def numbers(c: Char): Iterator[Int] = 
  if(Character.isDigit(c)) Iterator(Integer.parseInt(c.toString)) 
  else Iterator.empty
// numbers: (c: Char)Iterator[Int]
Run Code Online (Sandbox Code Playgroud)

而这个输入数据:

val data = List('a','b','c','1','d','&','*','x','9')
// data: List[Char] = List(a, b, c, 1, d, &, *, x, 9)
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这个函数变得懒惰,这样data只会处理到第一个出现的数字字符?

def firstNumber(data: List[Char]) :Int = data.flatMap(numbers).take(1)
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 6

data.iterator.flatMap(numbers).take(1).toList
Run Code Online (Sandbox Code Playgroud)

不要使用溪流; 您不需要存储旧数据.不要使用观点; 他们没有得到精心维护,无论如何都是矫枉过正的.

如果你想要一个Int,你需要一些默认行为.根据具体情况,您可以选择

data.iterator.flatMap(numbers).take(1).headOption.getOrElse(0)
Run Code Online (Sandbox Code Playgroud)

或类似的东西

{
  val ns = data.iterator.flatMap(numbers)
  if (ns.hasNext) ns.next
  else throw new NoSuchElementException("Number missing")
}
Run Code Online (Sandbox Code Playgroud)