如何用 Kotlin 编写此 Java 代码?
//Java
for (int i = 10; i > 0; i--);
如您所见,“i”不能为零。
我知道这个可以用“downTo”来完成,像这样:
for (i in 10 downTo 0)
但是“downTo”包含零。我希望它不包含零。我的问题是,在 Kotlin 中有没有办法做到这一点?(只在“for 循环”中实现,不改变零或十,也不用任何额外的“if”语句)
如何用 Kotlin 编写此 Java 代码?
//Java
for (int i = 10; i > 0; i--);
如您所见,“i”不能为零。
我知道这个可以用“downTo”来完成,像这样:
for (i in 10 downTo 0)
但是“downTo”包含零。我希望它不包含零。我的问题是,在 Kotlin 中有没有办法做到这一点?(只在“for 循环”中实现,不改变零或十,也不用任何额外的“if”语句)
请在 Kotlin 中解释此行为:
data class A<T>(val p: T)
class B
fun f1(): A<Number> = A(B()) as A<Number>
fun f2(): A<Unit> = A(B()) as A<Unit>
fun main() {
println("f1: ${f1().p::class.simpleName}") // print "f1: B"
println("f2: ${f2().p::class.simpleName}") // print "f2: Unit"
}
我希望在第一种和第二种情况下输出“B”。
此外,有趣的是,它可以正常工作data class A<T>(val p: T?)
。
这是某种编译器优化吗?
我已经使用 创建了一个集合Collections.synchronizedSet<T>(mutableSetOf<T>())
。它
SynchronizedSet
有自己的 (synchronized) 实现forEach
,与 (not synchronized) 提供的实现不同Iterable.forEach
,但是 Kotlin 的Iterable.forEach
实现带有注释@HidesMembers
,因此它会被调用而不是同步的实现。
我如何恢复的同步版本forEach
?
我之前是一名拥有十多年经验的 Web 开发者,但现在我想转到 Android 应用开发领域。我是 Android 新手,但有 Web 开发经验。为了开发 Android 应用,我开始学习 Kotlin,ubuntu system 24.04.2 LTS
但一直没能安装成功。
有谁有时间帮助我在我的 ubuntu 系统中设置 kotlin 吗?
我已经通过以下命令安装了 kotlin:
sudo snap install kotlin --classic
kotlin 2.1.20 from jetbrains✓ installed
安装后,我通过以下命令检查 kotlin 的版本:
kotlin -version
我的ubuntu系统给出的错误是:
error: no build.txt was found at home=/usr/share/kotlin/kotlinc
尽管预期输出是:
Kotlin 版本
我正在服务器上运行订阅(然后处理到 redis),但如果客户端断开连接(无论是连接失败还是离开页面),我需要调用操作。这可能吗?经过几天的搜索,我找不到任何文档或示例。
订阅端点示例
@Subscription("Notification")
fun notification(id: UUID): Multi<NotificationDto>? {
return dataSource.pubsub(NotificationDto::class.java)
.subscribe(id.toString())
.broadcast()
.toAllSubscribers()
}
如何使 Jackson@JsonUnwrapped
注释在 Kotlin 数据类中正确工作以进行反序列化?
除了为此类创建自定义反序列化器并将其作为模块添加到对象映射器之外,我没有找到任何简单的解决方案。
这是我的代码示例:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class)
@Schema(description = "Customer Details", allOf = [Address::class, Person::class])
data class CustomerDetails(
@JsonUnwrapped val addressDetails: Address?,// address related fields
@JsonUnwrapped val personDetails: Person? // person related fields
)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class)
data class Address(
val houseNumber: Int?,
val streetName: String?,
val city: String?
)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy::class)
data class Person(
val firstName: String?,
val lastName: String?,
val initials: String?
)
由于 @Schema 注释,swagger 页面运行良好。由于 @JsonUnwrapped 注释,对象到 JSON 的序列化按预期工作。但反序列化失败并出现错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法将 Creator 属性“属性名称”定义为@JsonUnwrapped
:组合尚不支持
目前,我正在使用
val response = supabase.from("schedules")
.select()
{ filter {eq("user_id", userId) } } // Filtering by the user_id
通过 uder_id 进行过滤。但是,在此之后,我还想通过默认值(布尔值)进行过滤。我找不到有关此内容的任何文档。有人可以给我一些建议吗?
我尝试过类似的事情
val response = supabase.from("schedules")
.select()
{ filter {eq("user_id", userId),eq("defualt", "TRUE") } }
和
val response = supabase.from("schedules")
.select()
{ filter {eq("user_id", userId) } }.select()
{ filter {eq("defualt", "TRUE") } }
但它们都不起作用。我找不到有关此问题的任何文档。有人能给我一些建议吗?
我正在使用replaceFirstChar()
并将uppercase()
字符串的第一个字符转换为大写。
但有些字符串的第一个字符可能是标点符号、引号等。在这种情况下,我希望它忽略它们,并替换它找到的第一个字母数字字符。
我怎样才能实现这个目标?
fun main(){
println("kotlin".replaceFirstChar { it.uppercase() }) // Kotlin
println("¡kotlin!".replaceFirstChar { it.uppercase() }) // I need ¡Kotlin!
println("¿kotlin?".replaceFirstChar { it.uppercase() }) // I need ¿Kotlin?
println("\"¿kotlin?\"".replaceFirstChar { it.uppercase() }) // I need "¿Kotlin?"
println("\"kotlin\"".replaceFirstChar { it.uppercase() }) // I need "Kotlin"
}
输出
Kotlin
¡kotlin!
¿kotlin?
"¿kotlin?"
"kotlin"
期望输出
Kotlin
¡Kotlin!
¿Kotlin?
"¿Kotlin?"
"Kotlin"
我创建了一个带有页眉和表格的 .PDF,我的问题是,当显示它时,它只显示最后两页的页码和总页数,例如,如果我有一个 5 页的文档,它只显示最后两页中的第 4 页(共 5 页)、第 4 页和第 5 页中的第 5 页(共 5 页),但它不显示第 1、2 和 3 页上的任何内容。我该如何解决这个问题?
document.add(headerTable)
document.add(font18)
document.add(listaClientes)
val totalPages = pdfDocument.getNumberOfPages()
val handler = PageNumberHandler(pdfDocument, totalPages)
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, handler)
document.add(
Paragraph(
"\nListado enviado el: ${
LocalDate.now().toString()
.let { reformatDate(it).replaceFirstChar(Char::titlecase) }
} "
).setTextAlignment(TextAlignment.CENTER)
)
document.close()
我的 PageNumberHandler
class PageNumberHandler(val pdfDocument: PdfDocument, val totalPages: Int) : IEventHandler {
override fun handleEvent(event: Event) {
val docEvent = event as PdfDocumentEvent
val pdfDoc = docEvent.document
val page = docEvent.page
val pageNumber = pdfDocument.getPageNumber(page)
val pageSize = page.pageSize
val x = pageSize.width - 50
val y = 20f // Ajusta este valor según la altura deseada del pie de página
val canvas = Canvas(page, pageSize)
val paragraph = Paragraph("Página $pageNumber de $totalPages")
.setTextAlignment(TextAlignment.RIGHT)
.setHorizontalAlignment(HorizontalAlignment.RIGHT)
canvas.showTextAligned(
paragraph,
x,
y,
pageNumber,
TextAlignment.RIGHT,
VerticalAlignment.BOTTOM,
0f
)
canvas.close()
}
我在 Arrow 文档中看到过这个示例:
import arrow.resilience.Schedule
suspend fun main() {
var result = ""
Schedule
.doWhile<String> { input, output -> input.length <= 5 }
.repeat {
result += "a"
result
}
println(result)
}
output
我不明白 lambda中的的用途是什么,doWhile
因为它总是与 相同input
。