Tag: java 8

我怎么能通过一个适当的方法参考,所以Nashorn可以执行它?

我正在尝试编写一个库,让我通过Nashorn Javascript引擎执行JSON逻辑规则。 我现在的问题是围绕着我创建的JSObject包装器来处理将数据从Java / Kotlin移动到脚本引擎中。 如果一个数组被传入,例如[true]它将被包装,并且json-logic脚本会接收它,看它是一个数组,并且尝试运行下面的代码: if(Array.isArray(logic)) { return logic.map(function(l) { return jsonLogic.apply(l, data); }); } 当调用.map函数时,Nashorn会调用getMember("map")来获取可执行的函数。 这是我卡住的地方。 我一直无法找到任何合适的语法给Nashorn一个方法或方法的引用,可以作为它的地图函数的接收器调用。 代码可以在这里找到: https : //github.com/deinspanjer/json-logic-java有一些基本的单元测试,包括发生问题的单元测试, JavaJsonLogicTest.simpleApplyJEJO() 。 破解的代码行是com/jsonlogic/JSObjectWrappers.kt:97 。 我非常感谢你的帮助。 更新:基于接受的答案,这里是工作Kotlin版本的代码: package com.jsonlogic import jdk.nashorn.api.scripting.AbstractJSObject import jdk.nashorn.api.scripting.JSObject import java.util.function.Function import javax.script.ScriptEngineManager fun main(args: Array<String>) { val m = ScriptEngineManager() val e = m.getEngineByName("nashorn") // The following JSObject […]

我如何声明一个函数参数来接受抛出的函数?

我在Kotlin中定义了一个函数: fun convertExceptionToEmpty(requestFunc: () -> List<Widget>): Stream<Widget> { try { return requestFunc().stream() } catch (th: Throwable) { // Log the exception… return Stream.empty() } } 我已经用这个签名定义了一个Java方法: List<Widget> getStaticWidgets() throws IOException; 我试图把它们写成这样: Stream<Widget> widgets = convertExceptionToEmpty(() -> getStaticWidgets()) 当我编译我得到这个错误: 错误:(ln,col)java:unreported exception java.io.IOException; 必须被逮捕或宣布被抛出 我如何定义我的函数参数来接受抛出的函数?

如何在Kotlin的Java 8 Stream上调用collect(Collectors.toList())?

我有一些代码: directoryChooser.title = "Select the directory" val file = directoryChooser.showDialog(null) if (file != null) { var files = Files.list(file.toPath()) .filter { f -> f.fileName.endsWith("zip") && f.fileName.endsWith("ZIP") && (f.fileName.startsWith("1207") || f.fileName.startsWith("4407") || f.fileName.startsWith("1507") || f.fileName.startsWith("9007") || f.fileName.startsWith("1807")) } for (f in files) { textArea.appendText(f.toString() + "\n") } } 如果我在过滤器的末尾调用collect(Collectors.toList()) ,我会得到: Error:(22, 13) Kotlin: [Internal Error] org.jetbrains.kotlin.codegen.CompilationException: […]

使用Kotlin中的Java Stream API获取列表中的元素

以下代码(用Kotlin编写)从列表中提取元素。 它工作,但看起来相当丑陋,难以阅读。 有没有更好的方法来写入与Java流API相同? (例子可以在Kotlin或Java中给出) val listOfLists: List<Any> = … val outList: MutableList<Any> = mutableListOf() listOfLists.forEach { list -> if (list is ArrayList<*>) list.forEach { l -> outList.add(l) } } return outList;

限制在Kotlin中的功能

Java 8中有一个流方法的limit : package com.concretepage.util.stream; import java.util.Arrays; import java.util.List; public class LimitDemo { public static void main(String[] args) { List<String> list = Arrays.asList("AA","BB","CC","DD","EE"); list.stream().limit(3).forEach(s->System.out.println(s)); } } 输出: AA BB CC Kotlin中的模拟名称是什么,或者如何以另一种方式做得更好?

用lambda参数记录kotlin

在log4j2中,我们有一个方便的功能,被描述为 // Java-8 style optimization: no need to explicitly check the log level: // the lambda expression is not evaluated if the TRACE level is not enabled logger.trace("Some long-running operation returned {}", () -> expensiveOperation()); 我试图在kotlin中使用它 log.debug("random {}", { UUID.randomUUID() }) 将打印 random Function0<java.util.UUID> 我们如何使用kotlin使用lambda参数记录? 或者我们如何明确地告诉科特林要调用什么方法?

什么Java 8 Stream.collect等价物在标准Kotlin库中可用?

在Java 8中,有Stream.collect ,它允许在集合上进行聚合。 在Kotlin中,这不是以同样的方式存在,除了可能作为stdlib中扩展函数的集合。 但是不清楚不同用例的等价关系是什么。 例如, JavaDoc for Collectors的顶部是为Java 8编写的示例,将它们移植到Kolin时,不能在不同的JDK版本上使用Java 8类,因此可能应该使用不同的方式编写。 就在线资源展示Kotlin集合的例子而言,它们通常是微不足道的,并没有真正与相同的用例相比较。 什么是真正符合Java 8 Stream.collect记录的案例的好例子? 这里的列表是: 将名字积累到列表中 将名称累加到TreeSet中 将元素转换为字符串并连接它们,用逗号分隔 计算员工的工资总额 按部门分组员工 按部门计算工资总额 将学生划分为通过和失败 上面链接了JavaDoc中的细节。 注意: 这个问题是由作者故意写的和回答的( 自我回答的问题 ),所以对于常见的Kotlin话题的习惯性的回答是在SO中。 此外,为了澄清一些真正的古老的答案写为科特林的阿尔法,是不是今天的Kotlin准确。