使多维阵列克隆成为可选

make multi dimensional array cloning optional

提问人:Andrzej Więcławski 提问时间:8/23/2021 最后编辑:İsmail Y.Andrzej Więcławski 更新时间:8/25/2021 访问量:109

问:

以下方法工作正常:

private static int[][] multiArrayClone(int[][] multiArray) {
    if (multiArray != null)
        return Arrays.stream(multiArray).map(int[]::clone).toArray(int[][]::new);
    else
        return null;
}

但我正在寻找使用方式,而不是“if null”条件。java.util.Optional<T>

Java 数组 选项类型 克隆

评论


答:

2赞 Giorgi Tsiklauri 8/23/2021 #1

您可以拥有:

private static int[][] multiArrayClone(Optional<int[][]> multiArray) {

    return multiArray.isPresent() ? 
            Arrays.stream(multiArray.get()).map(int[]::clone).toArray(int[][]::new) : null;

}

但是,请记住,您需要提供一个 ,而不仅仅是 ,作为参数。Optional<int[][]>int[][]

或者,如果要避免将其作为参数,可以在本地实例化:Optional<T>

private static int[][] multiArrayClone(int[][] multiArray) {
    Optional<int[][]> mr = Optional.of(multiArray);
    
    return mr.map(ints -> Arrays.stream(ints).map(int[]::clone).toArray(int[][]::new)).orElse(null);

}

正如你所看到的,是幕后 null 检查的包装器。Optional<T>

虽然在流中使用是合理的,但将所有 null 检查替换为可选检查并不是一个好主意。实际上,它们有时甚至比 null 检查更冗长,而且与简单的 null 检查相比,它们不会提高性能。Optional<T>

评论

0赞 Andrzej Więcławski 8/23/2021
谢谢。它有效。这样的解决方案是否有任何性能优势?如何测量?
3赞 Holger 8/23/2021
@AndrzejWięc瓦夫斯基当然不是。没有魔法与.这些变体只是更复杂,没有任何好处。Optional
0赞 Giorgi Tsiklauri 8/24/2021
@AndrzejWięc瓦夫斯基,我也在答案中加入了关于性能的观点。有人称其为美化的空检查。正如我所说,在某些情况下,使用它可能会很好,但我个人对 s 的看法并不是很令人兴奋。我认为它在 Java 中没有带来任何超级重要或有用的东西。但这是我个人的看法,有些人可能不同意。在许多情况下,它甚至会使代码的可读性膨胀和复杂化。Optional<T>
0赞 Andrzej Więcławski 8/24/2021
@GiorgiTsiklauri 在我的问题中,我被提高代码效率的愿望所驱使,但显然我对一些我不太了解的事情感到不必要的疑惑;感谢您的澄清
0赞 Anonymous 8/25/2021 #2

我不确定在您的方法中使用是否有任何优势。从该方法返回 an 可能是有利的。OptionalOptional

您可以优雅地同时执行以下两项操作:

private static Optional<int[][]> multiArrayClone(int[][] multiArray) {
    return Optional.ofNullable(multiArray)
            .map(ma -> Arrays.stream(ma).map(int[]::clone).toArray(int[][]::new));
}

根据您的要求,您可能还需要考虑在参数为 的情况下返回一个空数组。这可以使调用方免于考虑或考虑空。nullnullOptional

private static int[][] multiArrayClone(int[][] multiArray) {
    return Optional.ofNullable(multiArray)
            .map(ma -> Arrays.stream(ma).map(int[]::clone).toArray(int[][]::new))
            .orElse(new int[0][]);
}

评论

0赞 Andrzej Więcławski 8/25/2021
如果方法参数为 null,它仅在实例化 ArrayList 的第 2 维中返回 null?测试后:multiArrayClone(null) -> []。很有趣,但我不打算处理这样的结果。
0赞 Anonymous 8/27/2021
不知道你的意思,请问?第二个代码段返回一个长度为 0 的外部数组,也就是说,其中没有元素,也没有元素。但是,如果这个想法对你没有用,就放弃它。我让它站起来,因为它可能对其他人有用。nullnull