如果可能的话,Java如何使用reduce函数将两个数组减少/合并为一个?

Posted

技术标签:

【中文标题】如果可能的话,Java如何使用reduce函数将两个数组减少/合并为一个?【英文标题】:Java how to reduce/combine two arrays into one with the reduce function, if possible? 【发布时间】:2020-08-28 05:58:09 【问题描述】:

我有这个代码:

String[] arr1 = "asd1", "asd2", "asd3", "asd4", "asd5", "asd6", "asd7";
    String[] arr2 = "asd8", "asd9", "asd10", "asd11", "asd12", "asd13", "asd14";

    String[] concatenated = Stream.of(arr1, arr2)
           .flatMap(Stream::of)
           .toArray(String[]::new);

    String[] concatenated = Stream
            .concat(Arrays.stream(arr1), Arrays.stream(arr2))
            .toArray(String[]::new);

    String[] concatenated = Stream.of(arr1, arr2)
            .reduce(new String[arr1.length + arr2.length],
                    (String[] a, String[] b) -> )); ///// how to proceed from here?

    System.out.println(Arrays.toString(concatenated));

我在玩,但我没有找到如何使用 reduce 函数将它们结合起来得到这个结果:

[asd1, asd2, asd3, asd4, asd5, asd6, asd7, asd8, asd9, asd10, asd11, asd12, asd13, asd14]

注意:顺序并不重要,重要的是使用reduce函数将它们放入一个数组中。..

是否可以通过reduce来做到这一点?

【问题讨论】:

这能回答你的问题吗? How can I concatenate two arrays in Java? 为什么要使用reduce?第一个和第二个选项更容易理解 @ghosh 我看到了这篇文章,有点但不是真的,因为有一个答案是使用reduce,但在reduce 内部他使用的是Arrays.copyOf 和System.arraycopy,这不是我想要的为了实现两个数组的合并,如果有的话,我正在寻找其他替代方案。 @Line 我真的很喜欢 reduce 函数,因为它不是很常用而且在某些情况下可能可读(如你所说),我正在探索它的功能和解决这个简单问题的不同方法..跨度> 【参考方案1】:

目前这是我想出的最好的,如果有人感兴趣的话:

String[] concatenated = Stream
            .of(arr1, arr2)
            .reduce((a, b) -> 
                String[] result = Arrays.copyOf(a, a.length + b.length);
                System.arraycopy(b, 0, result, a.length, b.length);
                return result;
            )
            .orElseThrow();

    Stream.of(arr1, arr2)
            .reduce((a, b) -> 
                String[] result = Arrays.copyOf(a, a.length + b.length);
                System.arraycopy(b, 0, result, a.length, b.length);
                return result;
            )
            .ifPresent(strings -> System.out.println(Arrays.toString(strings)));

    Optional<String[]> concatenated2 = Stream
            .of(arr1, arr2)
            .reduce((a, b) -> 
                String[] result = Arrays.copyOf(a, a.length + b.length);
                System.arraycopy(b, 0, result, a.length, b.length);
                return result;
            );

    System.out.println(Arrays.toString(concatenated));

    concatenated2.ifPresent(strings -> System.out.println(Arrays.toString(strings)));

不完全是我想要的。我很高兴看到是否有人可以使用 reduce 提出更清洁的解决方案来解决此问题。我知道如果我将 reduce 的主体放在方法引用或其他东西中,我可以让它更干净,但事实并非如此。

【讨论】:

【参考方案2】:

这行得通。这是人为的。但是,恕我直言,任何使用 reduce 执行此操作的方法都是人为的,因为有更好的方法。

String[] result = Stream.of(arr1, arr2)
                .flatMap(Arrays::stream)
                .reduce("", (s1, s2) -> s1 + s2 + ",").split(",");

System.out.println(Arrays.toString(result));

【讨论】:

以上是关于如果可能的话,Java如何使用reduce函数将两个数组减少/合并为一个?的主要内容,如果未能解决你的问题,请参考以下文章

带有 3 个参数的 Java.reduce 函数究竟是如何工作的?

SQL中如何将两列拼接

如何将两种方法循环在一起?

React Reducer真的应该是一个纯函数吗?

如何查看hadoop mapreduce 性能

怎么将两列数据合并