我非常想使用Map.computeIfAbsent,但是因为lambdas在本科课程中已经太长了.
几乎直接来自文档:它给出了一个旧方法的例子:
Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>();
String key = "snoop";
if (whoLetDogsOut.get(key) == null) {
Boolean isLetOut = tryToLetOut(key);
if (isLetOut != null)
map.putIfAbsent(key, isLetOut);
}
Run Code Online (Sandbox Code Playgroud)
而新的方式:
map.computeIfAbsent(key, k -> new Value(f(k)));
Run Code Online (Sandbox Code Playgroud)
但在他们的例子中,我认为我并没有"得到它".我如何转换代码以使用新的lambda表达方式?
我有一个具体例子的一般性问题:在拍照时,我想在Android中使用Kotlin协程魔法而不是回调地狱.
manager.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(openedCameraDevice: CameraDevice) {
println("Camera onOpened")
// even more callbacks with openedCameraDevice.createCaptureRequest()....
}
override fun onDisconnected(cameraDevice: CameraDevice) {
println("Camera onDisconnected")
cameraDevice.close()
}
...
Run Code Online (Sandbox Code Playgroud)
我怎么把它转换成......错误......不那么难看的东西? 是否可以使用三个左右的函数进行平均回调,并通过将主流指定为promise-result路径将其转换为promise链? 如果是这样,我应该/我是否应该使用协同程序使其异步?
我喜欢async和.await会产生的东西
manager.open(cameraId).await().createCaptureRequest()
Run Code Online (Sandbox Code Playgroud)
我试图通过以下内容来做到这一点,但是...我不认为我正在使用CompletableDeferred!
suspend fun CameraManager.open(cameraId:String): CameraDevice {
val response = CompletableDeferred<CameraDevice>()
this.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(cameraDevice: CameraDevice) {
println("camera onOpened $cameraDevice")
response.complete(cameraDevice)
}
override fun onDisconnected(cameraDevice: CameraDevice) {
response.completeExceptionally(Exception("Camera onDisconnected $cameraDevice"))
cameraDevice.close()
}
override fun onError(cameraDevice: CameraDevice, error: Int) {
response.completeExceptionally(Exception("Camera onError $cameraDevice …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Android Studio 3.1预览版中构建https://github.com/neural-nuts/Cam2Caption,但是我使用的是很旧的build.gradle,或者它死于
Error:Execution failed for task ':Application:packageDebug'.
Execution of compression failed.
Run Code Online (Sandbox Code Playgroud)
在清理项目或重建之后,会发生这种情况。OSX,最新的一切。我正在使用我认为是默认的最新最大build.gradle
classpath 'com.android.tools.build:gradle:3.0.0'
...
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 26
targetSdkVersion 26
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
....
compile "com.android.support:support-v4:26.1.0"
compile "com.android.support:support-v13:26.1.0"
compile "com.android.support:cardview-v7:26.1.0"
compile "com.android.support:appcompat-v7:26.1.0"
Run Code Online (Sandbox Code Playgroud)
有了stacktrace,我得到了
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':Application:packageDebug'.
> java.io.IOException: Execution of compression failed.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':Application:packageDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100) …Run Code Online (Sandbox Code Playgroud) 我有一个Sequence(来自File.walkTopDown),我需要在每个上运行一个长时间运行的操作.我想使用Kotlin最佳实践/协同程序,但我要么没有并行性,要么太多并行性并且遇到"太多打开文件"IO错误.
File("/Users/me/Pictures/").walkTopDown()
.onFail { file, ex -> println("ERROR: $file caused $ex") }
.filter { ... only big images... }
.map { file ->
async { // I *think* I want async and not "launch"...
ImageProcessor.fromFile(file)
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎没有并行运行,我的多核CPU永远不会超过1 CPU的价值.是否有协同程序运行"NumberOfCores并行操作"值得延期的工作?
我使用Kotlin协同程序查看多线程,它首先创建所有作业,然后加入它们,但这意味着在重处理连接步骤之前完成序列/文件树步骤,这似乎......如果!将其拆分为收集和处理步骤意味着收集可以在处理之前运行.
val jobs = ... the Sequence above...
.toSet()
println("Found ${jobs.size}")
jobs.forEach { it.await() }
Run Code Online (Sandbox Code Playgroud) parallel-processing multithreading kotlin kotlinx.coroutines
我想我遗漏了一些关于如何在 JavaMail 中搜索的信息。
这有效。但是——为什么要这样做?如果我使用 javamail 连接到诸如 gmail 之类的东西,则搜索不会在服务器端执行,而且使用整个 javax.mail.search.SearchTerm 构造似乎没有任何优势提高效率或减少需要通过网络发送的数据量...
我没有看到任何在服务器端执行搜索并返回匹配列表的方法。有任何想法吗?
编辑:包括我现在正在做的伪代码,它不会在服务器端执行任何搜索。即使我将其转换为使用SearchTerm,它仍然不会在服务器端做任何事情,对吗?
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "gimaps");
final Session session = Session.getDefaultInstance(props, null);
final GmailSSLStore store = (GmailSSLStore) session.getStore("gimaps");
store.connect(ADDRESS, PASSWORD);
final GmailFolder allMailFolder = (GmailFolder) store.getFolder("[Gmail]/All Mail");
allMailFolder.open(Folder.READ_ONLY);
final Message[] allMessages = allMailFolder.getMessages();
System.out.println("Messages:" + allMessages.length);
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
allMailFolder.fetch(allMessages, fp);
for (final Message message : allMessages) {
final Address[] addrs = message.getFrom();
if (addrs != null) …Run Code Online (Sandbox Code Playgroud) tl/dr:Kotlin 如何使用 groupingBy 和聚合来获得(键,数字)对的序列以求和到计数映射?
我有 30gb 的 csv 文件,可以轻松阅读和解析。
File("data").walk().filter { it.isFile }.flatMap { file ->
println(file.toString())
file.inputStream().bufferedReader().lineSequence()
}. // now I have lines
Run Code Online (Sandbox Code Playgroud)
每行都是“key,extraStuff,matchCount”
.map { line ->
val (key, stuff, matchCount) = line.split(",")
Triple(key, stuff, matchCount.toInt())
}.
Run Code Online (Sandbox Code Playgroud)
我可以过滤“东西”,这很好,因为很多东西都被丢弃了——是的,懒惰的序列。(省略代码)
但是我需要一种懒惰的方法来获得最终的 Map(key:String to count:Int)。
我想我应该使用 groupingBy 和聚合,因为eachCount()只会计算行数,而不是总结 matchCount,并且 groupingBy 是懒惰的,而 groupBy 不是,但我们已经达到了我的知识范围。
.groupingBy { (key, _, _) ->
key
}.aggregate { (key, _, matchCount) ->
??? something with matchCount ???
}
Run Code Online (Sandbox Code Playgroud) 我仔细阅读了文档,但我不确定写规则和验证规则部分之间的区别.这个代码是多余的吗?使用其中一个或两者的任何一点?
特别:
{
"rules": {
"users": {
".validate": "auth != null && newData.val() === auth.uid",
"$user_id": {
".write": "$user_id === auth.uid"
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有几百个 Java 类实例,它们都需要完成它们的 .calculate() 方法或在 10 分钟内死亡。它们会占用 CPU 和内存,所以我只想一次只允许 5 个(线程?)。我相信我很接近,但是来自 Java 背景我还不够熟悉 kotlin 协程(vs java ExecutorServices)来进行编译。
// ...my logic to create a stream of identical class type instances
// that all have a vanilla blocking .calculate():Double method...
// which I now want to (maybe?) map to Jobs
listOf(MyClass(1), MyClass(2), MyClass(1000))
.map {
launch(CommonPool) {
val errorRate: Double? = it?.calculate()
println("${it?.javaClass?.simpleName} $errorRate") // desired output
errorRate
}
}
.collect(Collectors.toList<Job>())
jobs.forEach {
println(it.join())
}
Run Code Online (Sandbox Code Playgroud)
然后我想我需要用非阻塞计算来包装计算?还是阻塞,但超时限制?那个“runBlocking”应该在那里吗?在上面的代码中作为 lambda 更好吗?
fun MyClass.calculateTimeLimited(): Double = …Run Code Online (Sandbox Code Playgroud) 我有一个 manifest.json
"display": "fullscreen",
"orientation": "landscape"
Run Code Online (Sandbox Code Playgroud)
但是当从“安装到主屏幕”图标启动时,带有时钟和通知图标的最顶部栏仍然显示。有什么办法可以有真正的全屏选项吗?
chrome 文档说我也可以使用“独立” - 但即使这样,它仍然显示顶部栏。
制作一款沉浸式游戏很难!
我正在尝试将delegates/observable与vetoable结合起来(在查看源 kotlin.properties.Delegates.kt 后这不是问题),但是在尝试将属性存储在 map 中时事情变得棘手。
或者换句话说,如何将这三者结合起来:
var k1: Int by Delegates.observable(0) { property, oldValue, newValue ->
println("Hi from k1 observer")
}
var k2:Int by Delegates.vetoable(0) {property, oldValue, newValue ->
println("Hi from k2 more-than check")
oldValue > newValue
}
val myMap = mutableMapOf<String, Int>()
var k3 by myMap
Run Code Online (Sandbox Code Playgroud)