数组Object [] :: new的方法参考

时间:2018-04-10 13:34:23

标签: 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],但我对使用方法参考更感兴趣。有什么指针吗?

2 个答案:

答案 0 :(得分:2)

您可以删除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参数的方法并返回相关类型的数组。当您传递方法引用(例如String[]::new)时,您不会传递方法的参数(在本例中是数组的长度)。

或者,如果要将Stream收集到List然后将其转换为数组,则应将数组实例传递给该方法,而不是函数接口。因此,您需要写:

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

答案 1 :(得分:0)

您的代码中的问题比您创建数组的方式更值得怀疑。您通过new String[3]创建的第一个数组完全未使用。您将通过引用随后创建的新数组来覆盖其引用,因此您只能使用该数组来告知流进行三次迭代。另一种方法是使用IntStream.range

String[] randomstrs = IntStream.range(0, 3)
    .mapToObj(e -> Arrays.toString(rand.ints(3, 0, 5).toArray()).replaceAll("\\[|\\]", ""))
    .toArray(String[]::new); // compile error
System.out.println(Arrays.toString(randomstrs));

当然,如果你感兴趣的只是String表示,那么首先你可以collect将值String改为Collector。您也可以在嵌入式操作中使用相同的Arrays.toString,而不是转换String resultString = IntStream.range(0, 3) .mapToObj(e -> rand.ints(3, 0, 5).mapToObj(Integer::toString) .collect(Collectors.joining(", "))) .collect(Collectors.joining(", ", "[", "]")); System.out.println(resultString); 的结果:

String resultString = IntStream.range(0, 3)
    .flatMap(e -> rand.ints(3, 0, 5))
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", ", "[", "]"));
System.out.println(resultString);

但是,在这种情况下,您也可以使用

String resultString = rand.ints(3*3, 0, 5)
    .mapToObj(Integer::toString)
    .collect(Collectors.joining(", ", "[", "]"));
System.out.println(resultString);

甚至

ThreadLocalRandom

如果您真的想要数组,请将上面的第二个变体与``结合使用,但请注意,出于大多数实际目的,您可以只使用String[] randomstrs = IntStream.range(0, 3) .mapToObj(e -> ThreadLocalRandom.current().ints(3, 0, 5) .mapToObj(Integer::toString).collect(Collectors.joining(", "))) .toArray(String[]::new);

while(adminUsing || (u.isAdmin() && userCount > 0) || (!u.isAdmin() && adminsWaiting > 0))