我正在努力理解方法引用,但我不知道如何使用这本“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];
}
});
1条答案
按热度按时间pexxcrt21#
这是语言规范中的一个特例:
如果方法引用表达式具有
ArrayType::new
考虑了一种单一的概念方法。该方法只有一个类型为的参数int
,返回ArrayType
,并且没有throws子句。如果n=1,这是唯一可能适用的方法;否则,就没有可能适用的方法。还有:
如果表格是
Type[]^k :: new
(千)≥ 1) ,则调用方法的主体具有与窗体的数组创建表达式相同的效果new Type [ size ] []^k-1
,在哪里size
是调用方法的单个参数(符号[]^k
表示k个括号对的序列。)因此,您想要找到的“实现”隐藏在java编译器的某个地方,因为它都是“编译器魔法”。