什么" String [] :: new"意思?

时间:2017-06-01 14:26:41

标签: java java-8 java-stream method-reference

我正在学习如何使用流,我遇到了这个方法的问题。

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感到很困惑,你能给我一个暗示吗?

5 个答案:

答案 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[]::newmethod reference expression,在编译时它必须是assigned/casted到某个功能接口类型:

  

方法引用表达式用于引用到方法的调用,而不实际执行调用。某些形式的方法引用表达式还允许将类实例创建(第15.9节)或数组创建(第15.10节)视为方法调用。

     

如果T是功能接口类型(§9.8)且表达式与表达式一致,则方法引用表达式在赋值上下文,调用上下文或具有目标类型T的转换上下文中是兼容的从T。

派生的地面目标类型的函数类型

修改

正如@Eugene在下面的评论中提到的那样。有必要让您知道如何 流创建一个固定大小的数组来收集所有元素。

下表显示了如何来计算数组大小:

下表显示了流其中以按数组生成器IntFunction创建固定大小的数组:

答案 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());