how-knows-stream.toarray(图书[]::new);数组有多少个元素以及“book[]::new”的实现在哪里

tyg4sfes  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(290)

我正在努力理解方法引用,但我不知道如何使用这本“book[]::new”创建一个元素数正确的数组。

Book[] arrayBook = stBooks.toArray(Book[]::new);

为了在使用第二个和第三个选项时创建数组,我必须指定一个函数接口来接收int并返回一个新数组。
但是,在第一个选项中,我不知道实现在哪里,也不知道在哪里指定要包含数组的数量或元素。我认为它会为每个流元素创建一个新的数组元素,但如果我理解得很好,您必须提供实现,而“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];
    }
});
pexxcrt2

pexxcrt21#

这是语言规范中的一个特例:
如果方法引用表达式具有 ArrayType::new 考虑了一种单一的概念方法。该方法只有一个类型为的参数 int ,返回 ArrayType ,并且没有throws子句。如果n=1,这是唯一可能适用的方法;否则,就没有可能适用的方法。
还有:
如果表格是 Type[]^k :: new (千)≥ 1) ,则调用方法的主体具有与窗体的数组创建表达式相同的效果 new Type [ size ] []^k-1 ,在哪里 size 是调用方法的单个参数(符号 []^k 表示k个括号对的序列。)
因此,您想要找到的“实现”隐藏在java编译器的某个地方,因为它都是“编译器魔法”。

相关问题