这取决于您所说的“LINQ”到底是什么意思。 LINQ 有很多东西。
最明显的答案是:只需使用 Scala 的 .NET 端口即可。它使您可以完全本地访问 .NET 中的所有内容,其中显然包括 LINQ。
不幸的是,Scala 的 .NET 端口在几年前就被放弃了。幸运的是,几个月前它又被重新拾起,直接来自微软的官方资金也不少。您可以期待在 2011/2012 年的某个时间发布。
那么,什么是 LINQ?
添加到 .NET 的一些特性,特别是 C# 和 VB.NET LINQ。它们在技术上不是 LINQ 的一部分,但它们是必要的先决条件:类型推断、匿名(结构)类型、lambda 表达式、函数类型(Func<T...> 和 Action<T...>)和表达式树。所有这些都在 Scala 中存在了很长时间,其中大部分一直存在。
也不是 LINQ 的直接部分,但在 C# 中,LINQ 查询表达式可用于生成 XML,以模拟 VB.NET 的 XML 文字。 Scala 有 XML 文字,如 VB.NET。
更具体地说,LINQ 是
- 一组标准查询运算符的规范
- 这些运算符的一组实现(即
IQueryable、LINQ-to-XML、LINQ-to-SQL、LINQ-to-Objects)
- 用于 LINQ 查询理解的内置嵌入式语法
- 一个单子
在 Scala 中,与几乎所有其他函数式语言(实际上也几乎所有其他面向对象语言)一样,查询运算符只是标准集合 API 的一部分。在 .NET 中,它们的名称有点奇怪,而在 Scala 中,它们具有与其他语言相同的标准名称:Select 是 map,Aggregate 是 reduce(或 fold), SelectMany 是flatMap,Where 是filter 或withFilter,orderBy 是sort 或sortBy 或sortWith,还有zip 和@9864341@ 和@9867654339@等等。因此,这需要注意规范和 LINQ-to-Objects 实现。 Scala 的 XML 库还实现了集合 API,它负责 LINQ-to-XML。
Scala 中没有内置 SQL API,但有第三方 API 实现了集合 API。
Scala 还为这些 API 提供了专门的语法,但与 Haskell 不同,Haskell 试图让它们看起来像命令式 C 块,而 C# 试图让它们看起来像 SQL 查询,Scala 试图让它们看起来像 for 循环.它们被称为 for comprehensions,相当于 C# 的查询理解和 Haskell 的 monad 理解。 (它们还替换了 C# 的 foreach 和生成器 (yield return)。
但如果您真的想知道 Scala 中是否有 LINQ 的类似物,您首先必须具体说明“LINQ”的确切含义。 (当然,如果你想知道他们是否“理智”,你也必须定义它。)