在Java中通过元素连接合并字符串列表

在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("

我有一个CSV文件,我从中读取多个列(基于用户输入)作为
列表
,并希望生成一个
列表
,这样新
列表
的每个元素都是单个
列表
中相应元素的串联,由“\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());

在reduce
a
中,一开始是一个空列表(因此大小检查使得
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());

在reduce
a
中,一开始是一个空列表(因此大小检查使得
a.get
在第一次通过时不会抛出
IndexOutOfBounds
异常)。每次通过时,您将在
a
中获得累积结果,并在
b
中附加值。为此,我们使用
IntStream.range
来执行此操作,它将在
b
数组中为我们提供一个索引流,并在该映射中进行串联。

您好,请阅读。请提供您迄今为止编写的代码和您面临的问题。您发布了代码要求,但我没有看到阻止您编写自己的代码的问题描述。请回答您的问题,包括您的尝试/研究。更新问题。让我知道它是否有意义。谢谢!我不明白为什么人们坚持
,并强迫他们解决问题我的意思是,你可能可以使用
,但我很确定这看起来会很不愉快。您好,请阅读。并提供您迄今为止编写的代码以及您面临的问题。您发布了代码要求,但我看不到阻止您编写的问题的描述r自己的代码。请回答您的问题,包括您的尝试/研究。更新问题。让我知道它是否有意义。谢谢!我不明白为什么人们坚持使用
,并强迫他们在自然不适合的地方遇到问题。我的意思是,您可能可以使用
,但我很确定它看起来会很有趣非常不愉快。