java - 数组 Object[]::new 的方法引用

标签 java java-8

下面是我的代码:

Random rand = new Random();
String[] randomstrs  = new String[3];
randomstrs = Arrays.stream(randomstrs)
    .map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
    .collect(Collectors.toList())
    .toArray(String[0]::new); // compile error
System.out.println(Arrays.toString(randomstrs));

我想知道如何在 .toArray(String[0]::new); 行使用方法引用。我知道我们可以做 new String[0] 但我对使用方法引用更感兴趣。有什么指点吗?

最佳答案

您可以删除 collect()并从 Stream 生成一个数组直接:

randomstrs = 
    Arrays.stream(randomstrs)
          .map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
          .toArray(String[]::new);

请注意Stream::toArray预计 IntFunction<A[]> ,这意味着具有接受 int 的方法的功能接口(interface)参数并返回相关类型的数组。当您传递方法引用(例如 String[]::new )时,您不会传递该方法的参数(在本例中是数组的长度)。

或者,如果您想收集StreamList然后将其转换为数组,您应该将数组实例传递给该方法,而不是函数式接口(interface)。因此你需要写:

randomstrs = 
    Arrays.stream(randomstrs)
          .map(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
          .collect (Collectors.toList())
          .toArray(new String[0]);

关于java - 数组 Object[]::new 的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755051/

相关文章:

java - 检查复选框是否被选中

java - 避免在方法级别同步

java - 如果我无法更改父类,那么公共(public)属性和方法实现应该放在哪里?

java - 异常:com. fastxml.jackson.core.JsonParseException:HttpMessageNotReadableException

java - 文本文件错误扫描仪

java - 使用 rx-java2 : get first error 进行验证

java - CompletableFuture recoverWith 等效?即异常但返回 CompletableFuture<U>

java - 如何配置 Spring Cloud Stream 中函数的绑定(bind),以将其输入绑定(bind)到 Web 端点并将其输出绑定(bind)到 Kafka 主题

java - 与Java 8并行流相比,Spring Batch的任何性能改进均可以处理大量数据

java - 避免使用Options进行空检查分支