在Scala中阅读有关for comprehensions
的信息时,由于.net的linq
引起了deja vu的影响。
它们都允许简明的序列定义。
现在-问题是如何使用for comprehension
简洁地表示分组?
更加具体。在C#中:
from entry in new[] {
new { Name="Joe", ShoeSize="23" },
new { Name="Alice", ShoeSize="23" },
new { Name="Mary", ShoeSize="17" },
new { Name="Yeti", ShoeSize="170" },
}
group entry by entry.ShoeSize into grouped
select grouped;
产生:
Key=23, Items=(Joe, Alice)
Key=17, Items=(Mary)
Key=170, Items=(Yeti)
如何使用Scala
for comprehensions
简洁地实现相同目标? 最佳答案
Scala的理解能力没有分组能力。它只是map
,flatMap
和filter
(实际上是withFilter
,但filter
更容易理解)或foreach
和filter
的组合。
它们背后的原理并没有完全不同,但是LINQ是在SQL之后建模的,而理解是在monadic转换之后建模的。例如,您的示例可能会使用以下内容进行建模以进行理解:
for {
(shoeSize, groups) <- entry groupBy (_.shoeSize)
names = for (group <- groups) yield group.name
grouped = (shoeSize, names)
}
yield grouped
我希望LINQ可以做几乎相同的事情,但是因为预期,它会将这些转换包括在其基本语法中。