MethodHandle类的描述中显示的示例在使用以下描述WrongMethodTypeException的语句调用中抛出a mh.invokeExact("daddy",'d','n'): (CC)Ljava/lang/String; cannot be called with a different arity as ([Ljava/lang/Object;)Ljava/lang/Object;.
该MethodHandle对象mh具有对应于的符号类型描述符:(CC)Ljava/lang/String.但是当我们调用时mh.invokeExact("daddy",'d','n'),参数:d并n作为Object数组传递,然后它们与该类型的参数不匹配char.
我知道我可以使用invokeWithArguments而不是invokeExcat或者解决上述问题invoke,但是这个例子应该像MethodHandleJava 7 API 的描述中所说的那样工作.除此之外,它invokeWithArguments具有与invoke/ 相关的性能开销invokeExact.
user是一个 Mongoose 实体对象。then()我想在用户上附加一些数据,保存它,然后在该实体成功保存到数据库后继续下一步。所以我正在做:
User
.findOne({ email: req.body.email })
.then((user) => {
user.data = ...;
user = user.save().then(() => user);
return user;
})
.then((user => ... /* continue after user has been saved */ ))
Run Code Online (Sandbox Code Playgroud)
然而,我得到了一个TypeError: Chaining cycle detected for promise,但我没有意识到如何解决我的要求。
java.lang.OutOfMemoryError: Java heap space当我使用AbstractSpliterator实现时,我有一个报告未知大小的实现.
在这种情况下,我定义了一个类StreamCollapse,它AbstractSpliterator在tryAdvance()实现中扩展和合并一系列相邻元素.它的构造函数将超级构造函数调用为super(Long.MAX_VALUE, source.characteristics()).
关于API文档,我期望使用a Long.MAX_VALUE表示未知大小.但是,它似乎正在尝试分配具有该大小的内存.
为什么要分配那个空间?我应该使用什么价值估算大小?
这是一个示例测试:
Stream<Integer> nrs = Stream.of(3, 3, 5, 5, 3, 3, 3, 4, 4, 4 ,5 , 5);
Integer [] expected = {3, 5, 3, 4, 5};
Object[] actual = collapse(nrs).toArray();
assertEquals(actual, expected);
Run Code Online (Sandbox Code Playgroud)
和collapse()方法实现:
static <T> Stream<T> collapse(Stream<T> source) {
return StreamSupport.stream(
new StreamCollapse<T>(source.spliterator()), false);
}
class StreamCollapse<T> extends AbstractSpliterator<T> implements Consumer<T> {
private final Spliterator<T> …Run Code Online (Sandbox Code Playgroud) 在Java中开发一个带有CompletableFuture返回类型的异步方法,我们希望生成的CF能够正常或异常地完成,具体取决于该方法是成功还是失败.
但是,例如,考虑我的方法写入AsynchronousChannel并获得打开该通道的异常.它甚至没有开始写作.所以,在这种情况下,我正在试图让异常流向调用者.那是对的吗?
虽然调用者必须处理2种失败情况:1)异常,或2)拒绝承诺.
或者,我的方法应该捕获该异常并返回被拒绝的承诺吗?
在编写注释时,我想有一种快速的方式将文本格式化为代码。在Javadoc中,将文本格式设置为代码时,必须在{@code … }标签内包含文本。但是,键入大括号,然后键入@和此后的文本有点麻烦。因此,如果有快捷键可以更快地实现,那就太好了。
IntelliJ {@code .... }在Javadoc注释中插入的最简单方法是什么?
我正在开发一个带有 ASM 的 Java 检测引擎,有一种情况是评估堆栈在顶部有一个特定的值,我想在现有值之前插入一个ref(这是getstatic的结果)。即考虑只有一个值的堆栈: ,然后在getstatic 之后我希望堆栈变成这样:。value ->ref, value ->
要执行此行为,我必须插入以下字节码:getsatic和swap。使用 ASM 我会做类似的事情(考虑mv类型MethodVisitor):
mv.visitFieldInsn(Opcodes.GETSTATIC, ...);
mv.visitInsn(Opcodes.SWAP);
Run Code Online (Sandbox Code Playgroud)
问题是交换字节码不支持long和double值。所以上面的代码适用于单个单词类型,但它不适用于long和double类型。
是否有任何简单的解决方案可以解决long和double类型的问题并且不需要辅助本地值?
由于我的实验Optional<T>没有处理null元素,所以在下面的例子中它会抛出NullPointerException最后一个语句:
List<String> data = Arrays.asList("Foo", null, "Bar");
data.stream().findFirst().ifPresent(System.out::println);
data.stream().skip(1).findFirst().ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
所以,我仍然需要显式处理null和过滤非null元素,例如:
data.stream()
.filter(item -> item != null)
.skip(1)
.findFirst()
.ifPresent(System.out::println);
Run Code Online (Sandbox Code Playgroud)
是否有任何替代方法可以避免明确处理null: item != null
是中间表示 --IR -如Java 字节码或.net CIL,仍然是一个优势?我们不能只在源代码中部署软件组件吗?
支持IR的一个论点是软件组件的可移植性,这避免了为每个目标体系结构编译源代码的需要(关于该体系结构的虚拟机的存在).IR提供了对每个体系结构特性的抽象.以同样的方式并与元数据一起,它在实现安全保障方面带来了其他优势; 检查安全通道; 等等
今天,一些技术,如Node.js(带有V8引擎),在源代码中引入了可部署组件的想法,在Node.js中称为包(我不确定它是否是Node.js中的一个开创性的想法).源代码包含IR +元数据的相同信息.此外,使用源代码中的组件不会阻止运行时引擎使用现代虚拟机的相同原理,例如即时编译和后期绑定数据类型,这允许自适应优化,因此理论上可以更快地产生执行.
那么,在源代码中的组件中部署IR中的软件组件是否有任何优势?
Java 8引入了对第一类函数的支持,它允许将函数赋值给变量.在这种情况下,变量必须是函数类型,它由函数接口(只有一个抽象方法的接口)定义.
因此,考虑一个接口I和A具有以下定义的类的示例:
interface I{ int foo(); }
class A implements I{
public int foo(){return 7;}
public static int bar(){return 11;}
}
Run Code Online (Sandbox Code Playgroud)
我们可以分配给类型的变量I的实例A或方法参考该方法bar的A.两者都可以存储在类型的变量中I,例如:
I i1 = new A();
I i2 = A::bar;
Run Code Online (Sandbox Code Playgroud)
如果我们分析前面代码编译产生的字节码,我们将得到:
0: new #2 // class A
3: dup
4: invokespecial #3 // Method A."<init>":()V
7: astore_1
8: invokedynamic #4, 0 // InvokeDynamic #0:foo:()LI;
13: astore_2
Run Code Online (Sandbox Code Playgroud)
因为i1 …
基于processLineByLine()的示例,我注意到如果给定的文件名不存在,我们将无法捕获错误。在这种情况下,程序以如下内容结束:
UnhandledPromiseRejectionWarning:错误:ENOENT:没有这样的文件或目录
因此,我用来引发可捕获错误的最简单方法是对processLineByLine()函数进行 2 处修改:
function*await 文件存在检查 await access(filename, fs.constants.F_OK)最后我不得不将readline.Interface实例转换为异步生成器。我特别不喜欢这最后一部分。结果lines()函数是这样的:
export async function* lines(filename) {
await access(filename, fs.constants.F_OK)
const lines = readline.createInterface({
input: fs.createReadStream(filename),
crlfDelay: Infinity
})
for await (const l of lines) {
yield l
}
}
Run Code Online (Sandbox Code Playgroud)
问题:lines()如果文件名不存在,是否有更好的方法来返回异步迭代器或抛出错误?
BUG 报告:关于@jfriend00 观察,我在 nodejs 上打开了一个 Bug 问题:https : //github.com/nodejs/node/issues/30831
java ×4
java-8 ×3
jvm ×3
java-stream ×2
node.js ×2
asynchronous ×1
bytecode ×1
cil ×1
es6-promise ×1
java-7 ×1
javadoc ×1
javascript ×1
jit ×1
methodhandle ×1
mongodb ×1
mongoose ×1
promise ×1