使用Java 8流的大小为n到数组n x 2的数组

时间:2017-08-15 13:31:04

标签: arrays java-8 java-stream

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

传统上代码如下: -

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完成。

3 个答案:

答案 0 :(得分:7)

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循环,它几乎不可读。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

另一个变种可能是下一个:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    IQKeyboardManager.sharedManager().enable = true // ADD THIS !!!

    return true
}