scala - 使用流打印列表中的元素

标签 scala

为什么以下代码只打印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/

相关文章:

scala - 将 Scala Set 转换为 Java (java.util.Set)?

scala - 关于类型类的问题

java - Scala - 类被破坏了

Scala Spark 连接到远程集群

swing - 在scala中处理swing ScrollBar事件

具有特征的案例类的equals/hashCode的Scala语义

scala - 为什么在Scala中将Int等原始类型删除为Object?

java - HBase FuzzyRowFilter 不返回任何结果

scala - 保留特质个性,同时将它们混合

scala - 有没有办法在不使用 instanceOf 的情况下匹配除特定类型(或类型集)之外的所有内容?