如何在不使用foreach的情况下组合两个列表?

rau*_*ves 4 java collections list

最初,我有这个代码:

String[] A;
String[] B;
//...
List<String> myList= new ArrayList<>(A.length + B.length);
for (int i= 0; i< B.length; i++){
   myList.add(A[i]);
   myList.add("*".equals(B[i]) ? B[i] : doSomethingWith(B[i]));
}
Run Code Online (Sandbox Code Playgroud)

如果使用,优选Java 8,如何重构?

例如,我有这些数组

A = {"一","两","三","四"}

B = {"五","六","七","八"}

在代码的末尾,myList将是:

myList = {"one","five","two","six","three","seven","four","eight"}

hne*_*atl 5

我个人认为这不需要重构,因为任何"流式"代码都会比现有代码更不易读,也不那么直观,但作为一个纯粹的概念验证:

String[] A;
String[] B;
List<String> myList;

myList = IntStream.range(0, B.length)
                  .mapToObj(i -> new String[]
                      {
                          A[i],
                          "*".equals(B[i]) ? B[i] : doSomethingWith(B[i])
                      })
                  .flatMap(Arrays::stream)
                  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

工作演示.


  • 我们用来IntStream.range为我们的数组提供索引.

  • mapToObj每个索引映射到含有我们想要的元素的数组(也需要此阶段为IntStream::flatMap只能转换为另一种IntStream,我们希望将其转换为一个StreamString多个).

  • flatMap 将每个数组映射到流,然后"展平"生成的流.

  • 最后,我们只是collect结果.

  • 事实上,我个人无法看到对于所有内容需要流/ Java 8解决方案的痴迷,因为它只会使代码的可读性降低(在我看来). (2认同)