我想在Mac OSX上安装OpenJDK Java 11,并将其与其他JDK一起使用,因为它是一个较新版本.目前,我下载了tar.gz并将其放在我的路径中,但这很难维护.
我发现自动做更多事情的唯一其他安装是通过Homebrew cask进行的Oracle安装,但这是商业JDK,我想要开源的!
brew cask info java
Run Code Online (Sandbox Code Playgroud)
显示:
java:11,28:55eed80b163941c8885ad9298e6d786a https://www.oracle.com/technetwork/java/javase/overview/index.html
它是Oracle JDK而不是OpenJDK,请参阅:https: //discourse.brew.sh/t/how-to-install-openjdk-with-brew/712
从较旧的问题(Mac OS X和多个Java版本)的指示已过时,并给我错误的版本 - Oracle而不是OpenJDK.
更新: 截至2018年10月3日,Homebrew酒桶现在指向OpenJDK 11
在Java 8中,Stream.collect
允许对集合进行聚合.在Kotlin中,除了作为stdlib中的扩展函数的集合之外,它不以相同的方式存在.但目前尚不清楚不同用例的等价性.
例如,在JavaDocCollectors
的顶部是为Java 8编写的示例,当将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此它们应该以不同的方式编写.
在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,并没有真正与相同的用例进行比较.什么是真正符合Java 8记录的案例的好例子Stream.collect
?那里的清单是:
以上链接的JavaDoc中的详细信息.
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.
如果我有一个可空类型Xyz?
,我想引用它或将其转换为非可空类型Xyz
.在Kotlin这样做的惯用方法是什么?
例如,此代码出错:
val something: Xyz? = createPossiblyNullXyz()
something.foo() // Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Xyz?"
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先检查null是允许的,为什么?
val something: Xyz? = createPossiblyNullXyz()
if (something != null) {
something.foo()
}
Run Code Online (Sandbox Code Playgroud)
假设我确定它确实从未如此,如何null
在不需要if
检查的情况下更改或处理值null
?例如,在这里,我从地图中检索一个我可以保证存在的值而结果get()
不是null
.但是我有一个错误:
val map = mapOf("a" to 65,"b" to 66,"c" to 67)
val something = map.get("a")
something.toLong() // Error: "Only safe (?.) or non-null asserted (!!.) calls …
Run Code Online (Sandbox Code Playgroud) 我最近看到了用于InputStream
在Kotlin中读取字符串的全部内容的代码,例如:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
Run Code Online (Sandbox Code Playgroud)
并且:
val reader = BufferedReader(InputStreamReader(input))
try {
val results = StringBuilder()
while (true) {
val line = reader.readLine()
if (line == null) break
results.append(line)
}
val inputAsString = results.toString()
} finally {
reader.close()
}
Run Code Online (Sandbox Code Playgroud)
甚至这个看起来更顺畅,因为它会自动关闭InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Run Code Online (Sandbox Code Playgroud)
或者那个略有变化:
val results = StringBuilder() …
Run Code Online (Sandbox Code Playgroud) 在我的Kotlin JUnit测试中,我想启动/停止嵌入式服务器并在我的测试中使用它们.
我尝试@Before
在我的测试类中的方法上使用JUnit 注释,它工作正常,但它不是正确的行为,因为它运行每个测试用例而不是一次.
因此,我想@BeforeClass
在方法上使用注释,但将其添加到方法会导致错误,说它必须在静态方法上.Kotlin似乎没有静态方法.然后同样适用于静态变量,因为我需要保留对嵌入式服务器的引用,以便在测试用例中使用.
那么如何为我的所有测试用例创建一次这个嵌入式数据库呢?
class MyTest {
@Before fun setup() {
// works in that it opens the database connection, but is wrong
// since this is per test case instead of being shared for all
}
@BeforeClass fun setupClass() {
// what I want to do instead, but results in error because
// this isn't a static method, and static keyword doesn't exist
}
var referenceToServer: ServerType // wrong because is not static …
Run Code Online (Sandbox Code Playgroud) 在科特林,我不能做一个break
或continue
一个功能回路和我的拉姆达内-就像我可以从一个正常的for
循环.例如,这不起作用:
(1..5).forEach {
continue@forEach // not allowed, nor break@forEach
}
Run Code Online (Sandbox Code Playgroud)
有旧的文档提到这个可用,但它似乎从未实现过.当我想要continue
或break
来自lambda 时,获得相同行为的最佳方法是什么?
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.
我有一个清单:
val someList = listOf(1, 20, 10, 55, 30, 22, 11, 0, 99)
Run Code Online (Sandbox Code Playgroud)
我想在修改一些值时迭代它.我知道我可以这样做,map
但是它会复制一份清单.
val copyOfList = someList.map { if (it <= 20) it + 20 else it }
Run Code Online (Sandbox Code Playgroud)
如果没有副本我该怎么办?
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.
在Java中,我们被告知要严格避免在Android上使用枚举,因为它们占用了两倍的内存.
这适用enum class
于Kotlin吗?将Kotlin enum
编译成Java enum
吗?
在Kotlin中,我想将扩展方法添加到类中,例如添加到类中Entity
.但我只想Entity
在交易中看到这些扩展,否则隐藏.例如,如果我定义这些类和扩展:
interface Entity {}
fun Entity.save() {}
fun Entity.delete() {}
class Transaction {
fun start() {}
fun commit() {}
fun rollback() {}
}
Run Code Online (Sandbox Code Playgroud)
我现在可以叫意外save()
,并delete()
在任何时候,但我只希望他们可以在后start()
一交易后不再commit()
或rollback()
?目前我可以这样做,这是错误的:
someEntity.save() // DO NOT WANT TO ALLOW HERE
val tx = Transaction()
tx.start()
someEntity.save() // YES, ALLOW
tx.commit()
someEntity.delete() // DO NOT WANT TO ALLOW HERE
Run Code Online (Sandbox Code Playgroud)
如何使它们在正确的上下文中显示和消失?
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.其他答案也欢迎,有很多样式如何回答这个问题!
反序列化以下JSON的正确语法是什么:
[ {
"id" : "1",
"name" : "Blues"
}, {
"id" : "0",
"name" : "Rock"
} ]
Run Code Online (Sandbox Code Playgroud)
我试过了:
//Works OK
val dtos = mapper.readValue(json, List::class.java)
Run Code Online (Sandbox Code Playgroud)
不过我想:
val dtos : List<GenreDTO> = mapper.readValue(json,
List<GenreDTO>::class.java)
Run Code Online (Sandbox Code Playgroud)
上面的语法不正确,并给出: only classes are allowed on the left hand side of a class literal
kotlin ×9
java ×2
android ×1
break ×1
builder ×1
collections ×1
continue ×1
dsl ×1
enums ×1
inputstream ×1
iterator ×1
jackson ×1
java-12 ×1
java-8 ×1
java-stream ×1
json ×1
junit ×1
list ×1
loops ×1
mutable ×1
non-nullable ×1
nullable ×1
performance ×1
unit-testing ×1