我正在尝试理解方法引用,但我不知道如何使用这个“Book[]::new”创建一个 具有正确数量元素的数组。
Book[] arrayBook = stBooks.toArray(Book[]::new);
为了在使用第二个和第三个选项时创建数组,我必须指定一个功能接口 接收一个 Int 并返回一个新的 Array。
但是,在第一个选项中,我不知道实现在哪里以及您在哪里指定数字或 将具有数组的元素。我认为它为每个 Stream 元素创建一个新的数组元素 但如果我理解得很好,你必须提供实现,而“Book[]::new”没有它。
Book book1 = new Book("ESDLA");
Book book2 = new Book("Harry Potter");
Stream<Book> stBooks = Stream.of(book1, book2);
1. Method References
Book[] arrayBook = stBooks.toArray(Book[]::new);
2. With Lambda Implementation
Book[] arrayBook1 = stBooks.toArray( (numElements) -> new Book[numElements] );
3. With Implementation
Book[] arrayBook2 = stBooks.toArray( new IntFunction<Book[]>() {
@Override
public Book[] apply(int numElements) {
return new Book[numElements];
}
});
这是语言规范中的特殊情况:
如果方法引用表达式的形式为
,则考虑单一名义方法。该方法有一个ArrayType::new
类型的参数,返回int
,并且没有 throws 子句。如果 n = 1,这是唯一可能适用的方法;否则,没有可能适用的方法。ArrayType
还有:
如果形式为
(k ≥ 1),则调用方法的主体与Type[]^k :: new
形式的数组创建表达式具有相同的效果,其中new Type [ size ] []^k-1
是调用方法的单个参数。 (符号size
表示 k 个括号对的序列。)[]^k
所以你想要找到的“实现”隐藏在Java编译器的某个地方,因为它都是“编译器魔法”。