在Java中通过元素连接合并字符串列表
我有一个CSV文件,我从中读取多个列(基于用户输入)作为在Java中通过元素连接合并字符串列表,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,我有一个CSV文件,我从中读取多个列(基于用户输入)作为列表,并希望生成一个列表,这样新列表的每个元素都是单个列表中相应元素的串联,由“\ux”分隔 这意味着生成的列表的大小与每个列表的大小相同 e、 g 文件 col1A,col2A,col3A col1B,col2B,col3B 用户输入(范围:1到文件中的最大列数) 2,3 输出:包含内容的列表 [“col2A_col3A”、“col2B_col3B”] 喜欢使用流的功能解决方案 尝试编写一行代码: Arrays.stream("
列表
,并希望生成一个列表
,这样新列表
的每个元素都是单个列表
中相应元素的串联,由“\ux”分隔
这意味着生成的列表的大小与每个列表的大小相同
e、 g
文件
col1A,col2A,col3A
col1B,col2B,col3B
用户输入(范围:1到文件中的最大列数)
2,3
输出:包含内容的列表
[“col2A_col3A”、“col2B_col3B”]
喜欢使用流的功能解决方案
尝试编写一行代码:
Arrays.stream("2,3".split(",")
.map(Integer::parseInt)
.map(idx -> colProcessor.getColumn(idx)) // colProcessor.getColumn(idx) returns column with index 'idx' as List<String>
.collect(Collectors.toList());
Arrays.stream(“2,3.split(“,”))
.map(整数::parseInt)
.map(idx->colProcessor.getColumn(idx))//colProcessor.getColumn(idx)返回索引为“idx”的列作为列表
.collect(Collectors.toList());
但是,这会将两列连接到一个大小为2*
的列表中,这并不是理想的目标。您需要执行缩减
,这将占用流
,并将其转换为单个列表
,并产生连接结果:
Arrays.stream("2,3".split(","))
.map(Integer::parseInt)
.map(idx -> colProcessor.getColumn(idx))
.reduce(new ArrayList<>(), (a, b) -> IntStream.range(0, b.size()).mapToObj(i -> {
if (a.size() != 0) {
return a.get(i) + "__" + b.get(i);
} else {
return b.get(i);
}
}).collect(Collectors.toList()));
Arrays.stream(“2,3.split(“,”))
.map(整数::parseInt)
.map(idx->colProcessor.getColumn(idx))
.reduce(新的ArrayList(),(a,b)->IntStream.range(0,b.size()).mapToObj(i->{
如果(a.size()!=0){
返回a.get(i)+“_u”+b.get(i);
}否则{
返回b.get(i);
}
}).collect(Collectors.toList());
在reducea
中,一开始是一个空列表(因此大小检查使得a.get
在第一次通过时不会抛出IndexOutOfBounds
异常)。每次通过时,您将累积结果放入a
中,并将值追加到b
中。为此,我们使用IntStream.range
,它将在b
数组中为我们提供一个索引流,并在该映射中进行串联。您需要执行reduce
操作,以获取流e> 并将其转换为一个带有串联结果的列表
:
Arrays.stream("2,3".split(","))
.map(Integer::parseInt)
.map(idx -> colProcessor.getColumn(idx))
.reduce(new ArrayList<>(), (a, b) -> IntStream.range(0, b.size()).mapToObj(i -> {
if (a.size() != 0) {
return a.get(i) + "__" + b.get(i);
} else {
return b.get(i);
}
}).collect(Collectors.toList()));
Arrays.stream(“2,3.split(“,”))
.map(整数::parseInt)
.map(idx->colProcessor.getColumn(idx))
.reduce(新的ArrayList(),(a,b)->IntStream.range(0,b.size()).mapToObj(i->{
如果(a.size()!=0){
返回a.get(i)+“_u”+b.get(i);
}否则{
返回b.get(i);
}
}).collect(Collectors.toList());
在reducea
中,一开始是一个空列表(因此大小检查使得a.get
在第一次通过时不会抛出IndexOutOfBounds
异常)。每次通过时,您将在a
中获得累积结果,并在b
中附加值。为此,我们使用IntStream.range
来执行此操作,它将在b
数组中为我们提供一个索引流,并在该映射中进行串联。您好,请阅读。请提供您迄今为止编写的代码和您面临的问题。您发布了代码要求,但我没有看到阻止您编写自己的代码的问题描述。请回答您的问题,包括您的尝试/研究。更新问题。让我知道它是否有意义。谢谢!我不明白为什么人们坚持流
,并强迫他们解决问题我的意思是,你可能可以使用流
,但我很确定这看起来会很不愉快。您好,请阅读。并提供您迄今为止编写的代码以及您面临的问题。您发布了代码要求,但我看不到阻止您编写的问题的描述r自己的代码。请回答您的问题,包括您的尝试/研究。更新问题。让我知道它是否有意义。谢谢!我不明白为什么人们坚持使用流
,并强迫他们在自然不适合的地方遇到问题。我的意思是,您可能可以使用流
,但我很确定它看起来会很有趣非常不愉快。