我正在将我的 C# 项目之一移植到 Kotlin,该项目使用了 linq 的某些功能。作为一个例子,让我们以下面的 linq 查询为例:
from a in A
from b in B
from c in C
select fun(a,b,c);
Run Code Online (Sandbox Code Playgroud)
在 C# 中,这允许链接任何类型的函数,然后以一种易于阅读的方式收集结果,这几乎是可能需要的。这相当于(或多或少):
A.SelectMany(a => B, (a, b) => new {a, b}).SelectMany(t => C, (t, c) => fun( t.a, t.b, c));
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中实现 Enumerable.SelectMany 的功能不是问题,但它仍然与 C# 等效项一样嘈杂。
有没有什么方法可以在 Kotlin 中实现类似的东西,而无需摆弄嵌套元组的明确性,但更接近 linq?
我已经使用C#一段时间了,并试图使自己更加熟悉Java。因此,我试图迁移我每天在C#中使用的一些基本模式,甚至只是为了了解JVM和dotnet之间的差距并弄清楚如何处理它们。这是我遇到的第一个问题-选项类型-somethiong,在许多语言(即Koltlin)中都非常容易实现:
sealed class Option<out T : Any> {
object None : Option<Nothing>()
data class Some<out T : Any>(val value: T) : Option<T>()}
Run Code Online (Sandbox Code Playgroud)
这样我就可以轻松创建地图函子:
fun <T : Any, B : Any> Option<T>.map(f: (T) -> B): Option<B> =
when (this) {
is Option.None -> Option.None
is Option.Some -> Option.Some(f(this.value))}
Run Code Online (Sandbox Code Playgroud)
这是我可以用Java实现的吗?我不担心缺少扩展方法,我可以不用它,但是如何执行实际的类型匹配而不必依赖未经检查的类型转换?至少多数民众赞成在IntelliJ抱怨的是...
我正在尝试了解 Kafka 和 Schema Registry 如何处理 Avro 序列化消息 - 从这篇文章中我了解到架构 ID 存储在每条消息的可预测位置,因此似乎我们可以拥有消息同一主题中的各种模式,并能够找到正确的模式并基于此成功地反序列化它们。另一方面,我看到很多人似乎在使用“附加到主题的模式”这一表达方式,但这意味着每个主题有一个模式。
那么哪个是对的?我可以利用模式注册表(如 KSql)并在同一主题中拥有各种类型(或模式)的消息吗?
我正在尝试在 gradle 中设置 Antlr 任务,以在与包名称匹配的文件夹中生成源。
我尝试将包添加到语法的 @header 中,但这不会像 IntelliJ Antlr 插件那样生成包文件夹树。我还尝试按照下面的示例将包传递给属性来使用 CLI 参数。
generateGrammarSource {
maxHeapSize = "64m"
arguments += ["-package my.package.name", "-visitor"]
}
Run Code Online (Sandbox Code Playgroud)
然而我得到的是
任务:generateGrammarSource FAILED错误(2):未知的命令行选项-package my.package.name
当我将-package和my.package.name放入单独的条目 ( ["-package", "my.package.name", "-visitor"]) 时,代码生成会运行,但既不会将包添加到代码中,也不会创建文件夹。好像被忽略了
我使用 Antlr 版本 4.7.2,并且 gradle 与 intellij 191 捆绑在一起。
是否有一种特定于 gradle 的方法可以根据包名称设置 antlr 插件的输出位置?