Arrays 使用Java 8流将大小为n的数组转换为n x 2的数组
我正在尝试找出最优雅的方法,使用Java8流将简单的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++] =
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 );