小编Mic*_*luk的帖子

Kotlin 中的语言集成查询?

我正在将我的 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?

linq kotlin

6
推荐指数
1
解决办法
4303
查看次数

Java中的联合类型

我已经使用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抱怨的是...

c# java discriminated-union kotlin

5
推荐指数
1
解决办法
4036
查看次数

当 Schema Registry 与 Kafka 和 Avro 一起使用时,每个主题有一个或多个模式......?

我正在尝试了解 Kafka 和 Schema Registry 如何处理 Avro 序列化消息 - 从这篇文章中我了解到架构 ID 存储在每条消息的可预测位置,因此似乎我们可以拥有消息同一主题中的各种模式,并能够找到正确的模式并基于此成功地反序列化它们。另一方面,我看到很多人似乎在使用“附加到主题的模式”这一表达方式,但这意味着每个主题有一个模式。

那么哪个是对的?我可以利用模式注册表(如 KSql)并在同一主题中拥有各种类型(或模式)的消息吗?

avro apache-kafka confluent-schema-registry

3
推荐指数
1
解决办法
2950
查看次数

如何使用 gradle antlr 插件将包名称传递给 antlr4 语法而不使用 @header

我正在尝试在 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

当我将-packagemy.package.name放入单独的条目 ( ["-package", "my.package.name", "-visitor"]) 时,代码生成会运行,但既不会将包添加到代码中,也不会创建文件夹。好像被忽略了

我使用 Antlr 版本 4.7.2,并且 gradle 与 intellij 191 捆绑在一起。

是否有一种特定于 gradle 的方法可以根据包名称设置 antlr 插件的输出位置?

antlr4 gradle-plugin

1
推荐指数
1
解决办法
978
查看次数