为什么以下代码只打印1,而不打印其余列表元素?
scala> val l: List [Int] = List(1,2,3)
l: List[Int] = List(1, 2, 3)
scala> l.toStream.map(x => print(x))
1res3: scala.collection.immutable.Stream[Unit] = Stream((), ?)
编写此代码的正确方法是什么?
最佳答案
我将答案分为两个部分:
1. Scala中的map
方法:
您正在使用map
,它期望一个没有副作用的功能(打印是一种副作用)。您正在寻找的是:
l.toStream.foreach(x => print(x))
基本上,一般的想法是map
接受某些内容并将其转换为其他内容(例如,增加其值)。而foreach
正在对该值执行某些不应具有返回值的操作。scala> l.toStream.foreach(x => print(x))
123
2. Scala中的Stream
:流是lazy,因此Scala仅计算其所需的值。试试这个:
scala> l.toStream.map(x => x+1)
res2: scala.collection.immutable.Stream[Int] = Stream(2, ?)
您可以看到它计算出第一个值,并且问号指出它不知道后面是什么,因为它尚未计算出它。在您的示例中,第一个值是空,因为print
不返回任何值。
关于scala - 使用流打印列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48360332/