我正在学习如何使用流,我遇到了这个方法的问题。
public static String[] inArray(String[] array1, String[] array2) {
return Arrays.stream(array1)
.filter(str -> Arrays.stream(array2).anyMatch(s -> s.contains(str)))
.distinct().sorted().toArray(**String[]::new**);
}
我对String[]::new
感到很困惑,你能给我一个暗示吗?
答案 0 :(得分:9)
size -> new String[size]
表示generator
。
当Stream#toArray(IntFunction<A[]> generator)
准备好生成数组时,它会调用{{1}}并传递(generator.apply
)内部集合的大小以获取一个集合来填充它。
答案 1 :(得分:3)
Stream#toArray的文档完全说明了这一点:
生成器函数采用一个整数,它是所需数组的大小,并生成一个所需大小的数组。
例如:
IntFunction<int[]> factory = int[]::new;
// v--- once `apply(3)` is invoked,it delegates to `new int[3]`
int [] array = factory.apply(3);
// ^--- [0, 0, 0] create an int array with size 3
String[]::new
是method reference expression,在编译时它必须是assigned/casted到某个功能接口类型:
方法引用表达式用于引用到方法的调用,而不实际执行调用。某些形式的方法引用表达式还允许将类实例创建(第15.9节)或数组创建(第15.10节)视为方法调用。
如果T是功能接口类型(§9.8)且表达式与表达式一致,则方法引用表达式在赋值上下文,调用上下文或具有目标类型T的转换上下文中是兼容的从T。
派生的地面目标类型的函数类型
正如@Eugene在下面的评论中提到的那样。有必要让您知道如何和 流创建一个固定大小的数组来收集所有元素。
下表显示了如何来计算数组大小:
Spliterator
- Spliterator#estimateSize Spliterator
- AbstractConcNode#AbstractConcNode 下表显示了流其中以按数组生成器IntFunction
创建固定大小的数组:
顺序流
Spliterator
- SpinedBuffer#asArray 并行流
Spliterator
- Nodes#collect Spliterator
- Nodes#flatten 答案 2 :(得分:1)
您的整个流操作终止将其转换为数组,这是您使用最后一个方法 toArray()所做的,但是一个什么的数组?.... 字符串(因此 String [] :: new )
答案 3 :(得分:1)
toArray(...)
的参数是一个功能接口(即IntFunction<R>
,然后String[]::new
被定义为方法参考,或者在这种情况下使用的构造函数生成所需类型的数组
请参阅https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
答案 4 :(得分:0)
要将您的信息流转换为另一个列表,您可以使用:
.collect(Collectors.toList());