代码之家  ›  专栏  ›  技术社区  ›  user7780894

数组对象[]的方法引用::新建

  •  1
  • user7780894  · 技术社区  · 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 回复  |  直到 8 年前
        1
  •  3
  •   Eran    8 年前

    您可以删除 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 ),则不传递方法的参数(在本例中是数组的长度)。

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

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

    您的代码中有比创建数组的方式更值得怀疑的地方。您通过创建的第一个阵列 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 a的值 一串 首先。您也可以使用相同的 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);