Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用Java 8流将大小为n的数组转换为n x 2的数组_Arrays_Java 8_Java Stream - Fatal编程技术网

Arrays 使用Java 8流将大小为n的数组转换为n x 2的数组

Arrays 使用Java 8流将大小为n的数组转换为n x 2的数组,arrays,java-8,java-stream,Arrays,Java 8,Java Stream,我正在尝试找出最优雅的方法,使用Java8流将简单的int数组(例如{1,2,3})转换为字符串对的简单数组(例如{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++] =

我正在尝试找出最优雅的方法,使用Java8流将简单的
int
数组(例如
{1,2,3}
)转换为字符串对的简单
数组(例如
{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);
}
但假设这可以在Java8的1-liner中完成

String[] result = Arrays.stream(input)
            .mapToObj(x -> new String[] { "id", "" + x })
            .flatMap(Arrays::stream)
            .toArray(String[]::new);
或者可能会有点冗长(但更糟糕的是,因为我们是第一次加入,只是在加入后立即分裂)

我可以想到这两个,但它几乎没有更可读性,你已经有了一个简单的for循环

或者可能会有点冗长(但更糟糕的是,因为我们是第一次加入,只是在加入后立即分裂)


我可以想到这两种方法,但它的可读性很难比简单的for循环更高。

会使它的可读性比:


可能使其可读性甚至低于:


另一个变化是下一个:

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

另一个变化是下一个:

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

它不能在一行程序中完成(除非该行包含多条链式指令),而且for循环速度更快,更易于阅读和理解。我想知道为什么需要一个数组,其中每个偶数元素都有相同的值。对我来说,实现它最合理的方法是:for(inti=0,len=output.length;ioutput[i]=i%2==0?“id”:String.valueOf(input[i/2]);不能在一行中完成(除非该行包含多个链接指令),并且for循环更快,更易于阅读和理解。我更想知道为什么需要一个数组,其中每个偶数元素都有相同的值。它是冗余的,因此是设计气味的标志。对我来说,实现它的最合理方法是:for(int I=0,len=output.length;Ioutput[i]=i%2==0?“id”:String.valueOf(input[i/2]);
.mapToObj
在这里不起作用,
map
似乎没问题?@bobmarksie如果你的输入真的是
int[]input={1,2,3}如果你说
map
有效,这意味着你的输入包含对象(
Integer
)而不是原语。你可以先将
int
转换为
String
,例如:
mapToObj(String::valueOf).flatMap(it->Stream.of(“id”,it))…
谢谢Eugene,我有点支持可读性和新的闪亮的做事方式,在这种情况下,它似乎不是更可读。IMMHO,这个解决方案很糟糕,真的很糟糕,因为你要么创建完全不必要的字符串[],要么创建join/split。没什么大不了的?还记得著名的代码吗:string str=new string(“abc”);它以编写代码的方式显示您的字符。
.mapToObj
在这里不起作用,
map
似乎还可以?@bobmarksie如果您的输入真的是
int[]input={1,2,3};
mapToObj
好,而不是
map
。如果您说
map
有效,则表示您的输入包含对象(
Integer
)而且不是原语。您可以先将
int
转换为
String
,例如:
mapToObj(String::valueOf).flatMap(it->Stream.of(“id”,it))…
谢谢Eugene,我有点支持可读性和新的闪亮的做事方式,在这种情况下,它似乎不是更可读。IMMHO,这个解决方案很糟糕,真的很糟糕,因为你要么创建完全不必要的字符串[],要么创建join/split。没什么大不了的?还记得著名的代码吗:string str=new string(“abc”);它以编写代码的形式显示您的字符。
String[] result = Arrays.stream( input )
                .boxed()
                .flatMap( x -> Stream.of( "id", Integer.toString( x ) ) )
                .toArray( String[]::new );