小编Jay*_*ard的帖子

如何在Mac OSX上安装Java以允许版本切换?

我想在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 java-12

241
推荐指数
5
解决办法
14万
查看次数

标准Kotlin库中提供了哪些Java 8 Stream.collect等价物?

在Java 8中,Stream.collect允许对集合进行聚合.在Kotlin中,除了作为stdlib中的扩展函数的集合之外,它不以相同的方式存在.但目前尚不清楚不同用例的等价性.

例如,在JavaDocCollectors顶部是为Java 8编写的示例,当将它们移植到Kolin时,在不同的JDK版本上不能使用Java 8类,因此它们应该以不同的方式编写.

在网上显示Kotlin集合示例的资源方面,它们通常是微不足道的,并没有真正与相同的用例进行比较.什么是真正符合Java 8记录的案例的好例子Stream.collect?那里的清单是:

  • 将名称累积到列表中
  • 将名称累积到TreeSet中
  • 将元素转换为字符串并将它们连接起来,用逗号分隔
  • 计算员工工资的总和
  • 按部门分组员工
  • 按部门计算工资总额
  • 将学生分成传球和失败

以上链接的JavaDoc中的详细信息.

注意: 这个问题是由作者故意编写和回答的(答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.

java collections java-8 kotlin java-stream

171
推荐指数
2
解决办法
3万
查看次数

在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)

nullable non-nullable kotlin

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

在Kotlin中,如何将InputStream的全部内容读入String?

我最近看到了用于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)

inputstream kotlin

85
推荐指数
1
解决办法
4万
查看次数

如何管理Kotlin中的单元测试资源,例如启动/停止数据库连接还是嵌入式弹性搜索服务器?

在我的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)

junit unit-testing kotlin

74
推荐指数
1
解决办法
2万
查看次数

在Kotlin的功能循环中,如何"中断"或"继续"?

在科特林,我不能做一个breakcontinue一个功能回路和我的拉姆达内-就像我可以从一个正常的for循环.例如,这不起作用:

(1..5).forEach {
    continue@forEach  // not allowed, nor break@forEach
}
Run Code Online (Sandbox Code Playgroud)

旧的文档提到这个可用,但它似乎从未实现过.当我想要continuebreak来自lambda 时,获得相同行为的最佳方法是什么?

注意: 这个问题是由作者故意编写和回答的(答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.

loops functional-programming continue break kotlin

44
推荐指数
1
解决办法
2万
查看次数

在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来说是不准确的.

iterator list mutable kotlin

32
推荐指数
1
解决办法
2万
查看次数

Kotlin枚举类在Android中的表现

在Java中,我们被告知要严格避免在Android上使用枚举,因为它们占用了两倍的内存.

这适用enum class于Kotlin吗?将Kotlin enum编译成Java enum吗?

performance enums android kotlin

22
推荐指数
3
解决办法
4476
查看次数

在Kotlin中,如何将扩展方法添加到另一个类,但只在某个上下文中可见?

在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来说是不准确的.其他答案也欢迎,有很多样式如何回答这个问题!

dsl builder kotlin

21
推荐指数
2
解决办法
3024
查看次数

如何使用Kotlin + Jackson将JSON反序列化为List <SomeType>

反序列化以下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

json jackson kotlin

18
推荐指数
3
解决办法
2万
查看次数