【问题标题】:Array of size n to array n x 2 using Java 8 stream使用 Java 8 流的大小为 n 的数组到数组 n x 2
【发布时间】:2017-08-15 13:31:04
【问题描述】:

我正在尝试找出使用 Java 8 流将简单的 int 数组(例如 {1, 2, 3})转换为字符串对的简单 String 数组(例如 {"id", "1", "id", "2", "id", "3"})的最优雅方法。

传统上,代码如下所示:-

int[] input = {1, 2, 3};

String[] output = new String[input.length * 2];

int i = 0;
for (int val : input) {
    output[i++] = "id";
    output[i++] = String.valueOf(val);
}

但假设这可以在 Java 8 的 1-liner 中完成。

【问题讨论】:

  • 它不能在单行中完成(除非该行包含多个链式指令),而且 for 循环更快,更易于阅读和理解。我宁愿怀疑为什么你需要一个每个偶数元素都具有相同值的数组。它是多余的,因此是设计气味的标志。
  • 对我来说,最合理的实现方式是:for (int i = 0, len = output.length; i output[i] = i % 2 == 0 ? "id" : String.valueOf(input[i / 2]));

标签: arrays java-8 java-stream


【解决方案1】:
String[] result = Arrays.stream(input)
            .mapToObj(x -> new String[] { "id", "" + x })
            .flatMap(Arrays::stream)
            .toArray(String[]::new);

或者可能更冗长(但更糟糕的是,因为我们是第一次加入,之后才立即拆分)

String[] result = Arrays.stream(input)
            .mapToObj(x -> "id" + "," + x)
            .collect(Collectors.joining(","))
            .split(",");

我能想到这两个,但是用一个简单的 for 循环来理解你已经拥有的东西几乎没有什么可读性。

【讨论】:

  • .mapToObj 在这里不起作用,map 似乎还可以?
  • @bobmarksie 如果您的输入真的是int[] input = { 1, 2, 3 }; 而不是mapToObj 而不是map。如果您说 map 有效,则表示您的输入包含对象 (Integer) 而不是原语
  • 你好,你可以先把int转换成String,例如:mapToObj(String::valueOf).flatMap(it-> Stream.of("id", it))...
  • 谢谢尤金,我有点支持可读性与新的做事方式,在这种情况下它似乎不更具可读性。
  • 恕我直言,这个解决方案很糟糕,真的很糟糕,因为您要么创建完全不必要的字符串 [] 要么加入/拆分。没什么大不了的?记住著名的代码: String str = new String("abc");它在编写代码时显示您的角色。
【解决方案2】:

可以使它比Eugene's solution更不可读:

String[] output = IntStream.range(0, input.length * 2)
        .mapToObj(x -> x % 2 == 0 ? "id" : input[x / 2 ] + "")
        .toArray(String[]::new);

【讨论】:

    【解决方案3】:

    接下来可能会出现另一种变化:

    String[] result = Arrays.stream( input )
                    .boxed()
                    .flatMap( x -> Stream.of( "id", Integer.toString( x ) ) )
                    .toArray( String[]::new );
    

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 2019-02-03
      • 2020-07-11
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多