【问题标题】:Using Java streams to merge a pair of `int` arrays [duplicate]使用Java流合并一对`int`数组[重复]
【发布时间】:2020-08-01 10:58:05
【问题描述】:

This page 展示了如何将两个Integer 对象数组组合成一个Object 对象数组。

Integer[] firstArray = new Integer[] { 10 , 20 , 30 , 40 };
Integer[] secondArray = new Integer[] { 50 , 60 , 70 , 80 };
Object[] merged = 
        Stream
        .of( firstArray , secondArray )
        .flatMap( Stream :: of )
        .toArray()
;

Arrays.toString( 合并 ): [10, 20, 30, 40, 50, 60, 70, 80]

➥ 有没有办法使用 Java 流来连接一对原始 int 值数组而不是对象?

int[] a = { 10 , 20 , 30 , 40 };
int[] b = { 50 , 60 , 70 , 80 };
int[] merged = … ?

我意识到使用 Java 流可能不是最有效的方法。但我对原语和 Java 流的相互作用很好奇。

我知道IntStream,但不知道如何将其用于此目的。

【问题讨论】:

    标签: java arrays merge java-stream


    【解决方案1】:

    IntStream.concat

    将每个数组转换为IntStream。然后拨打IntStream.concat进行合并。

    最后,通过调用IntStream::toArray 生成一个int 数组。

    int[] a = { 10 , 20 , 30 , 40 };
    int[] b = { 50 , 60 , 70 , 80 };
    
    int[] merged = IntStream.concat(IntStream.of(a), IntStream.of(b)).toArray();
    
    System.out.println(Arrays.toString(merged));
    

    看到这个code run live at IdeOne.com

    输出:

    [10, 20, 30, 40, 50, 60, 70, 80]
    

    提示:要对结果进行排序,请在.toArray() 之前调用.sorted()。如running on IdeOne.com所见。

    【讨论】:

    • 这似乎是所有这些有趣的答案中最有效的,因为它是唯一避免auto-boxing 开销的答案。任何人,如果我对这项工作所涉及的拳击有误解,请纠正我。
    • @BasilBourque 快速测试:在Integer#valueOf 下一个断点,运行调试器,看看它是否被触发。它没有:) 在 openjdk 版本“11.0.6”2020-01-14
    • @BasilBourque 顺便说一句,the other variant 在某个方面仍然比than this 稍微好一点。
    【解决方案2】:

    这是一种方法,使用Stream::flatMapToInt

    int[] a = { 10 , 20 , 30 , 40 };
    int[] b = { 50 , 60 , 70 , 80 };
    int[] merged = Stream.of(a,b).flatMapToInt(IntStream::of)
                    .toArray();
    

    【讨论】:

    • 有趣。我没有注意到Stream::flatMapToInt。但我怀疑Answer by caco3 会避免自动装箱,因此性能更高。
    • 是的。我忘记了IntStream.concat()。在这些日子里,我可能会把这一切都记下来。
    【解决方案3】:

    如果你想使用merged,你可以使用类似的东西:

    Integer[] firstArray = new Integer[] {10, 20, 30, 40};
    Integer[] secondArray = new Integer[] {50, 60, 70, 80};
    Object[] merged = Stream.of(firstArray, secondArray).flatMap(Stream::of).toArray();
    
    int[] ints = Arrays.stream(merged).mapToInt(o -> Integer.parseInt(o.toString())).toArray();
    System.out.println(Arrays.toString(ints));
    

    输出:

    [10, 20, 30, 40, 50, 60, 70, 80]
    

    【讨论】:

      【解决方案4】:

      您可以使用Streamconcat 方法将它们合并,并使用IntStreamboxed 方法将其转换为Stream

      int[] firstArray = new int[]{10, 20, 30, 40};
      int[] secondArray = new int[]{50, 60, 70, 80};
      Object[] merged =
              Stream
                    .concat(Arrays.stream(firstArray).boxed(), Arrays.stream(secondArray).boxed())
                    .toArray();
      
      System.out.println(Arrays.toString(merged)); // [10, 20, 30, 40, 50, 60, 70, 80]
      

      【讨论】:

      • 值得一票,但看起来Answer by caco3 在避免自动装箱开销的同时做了很多相同的事情。
      猜你喜欢
      • 1970-01-01
      • 2016-11-05
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      相关资源
      最近更新 更多