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

时间:2018-01-12 11:17:47

标签: java list collections

最初,我有这段代码:

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]));
}

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

例如,如果我有这些数组

A = {“one”,“two”,“three”,“four”}

B = {“五”,“六”,“七”,“八”}

在代码的末尾,myList将是:

myList = {“one”,“five”,“two”,“six”,“three”,“seven”,“four”,“8”}

2 个答案:

答案 0 :(得分: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());

Working demo

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

  • mapToObj将每个索引映射到包含我们想要的元素的数组(此阶段也需要IntStream::flatMap只能转换为另一个IntStream,我们要转换它到Stream String s。{

  • flatMap将每个数组映射到一个流,然后“展平”生成的流。

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

答案 1 :(得分:-2)

尝试这样的事情:

 String[] A;
 String[] B;
 //...
 List<String> myList= Arrays.asList (A);
 List<String> myList2 = Arrays.stream(B).map(
    (x)->"*".equals(x) ? x : doSomethingWith(x))
    .collect(Collectors.toList());
 myList.addAll(myList2);