You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用foreach合并两个列表?及Java 8重构指定代码方案

嘿,这两个Java相关的问题我都帮你梳理清楚啦,来看具体解决方案:

1. 不使用foreach合并两个列表的方法

这里给你几种实用的实现方式,按需选择就行:

  • 使用List的addAll()方法:这是最简洁高效的方式,底层是数组拷贝操作,性能很好。示例代码:
    List<String> list1 = Arrays.asList("a", "b", "c");
    List<String> list2 = Arrays.asList("d", "e", "f");
    List<String> mergedList = new ArrayList<>(list1.size() + list2.size());
    mergedList.addAll(list1);
    mergedList.addAll(list2);
    
  • 传统for循环手动遍历:完全手动控制遍历过程,适合需要自定义逻辑的场景:
    List<String> mergedList = new ArrayList<>(list1.size() + list2.size());
    for (int i = 0; i < list1.size(); i++) {
        mergedList.add(list1.get(i));
    }
    for (int i = 0; i < list2.size(); i++) {
        mergedList.add(list2.get(i));
    }
    
  • Java 8+ Stream API合并:用流的方式实现函数式风格的合并,代码更简洁:
    List<String> mergedList = Stream.concat(list1.stream(), list2.stream())
                                   .collect(Collectors.toList());
    
2. Java 8重构你的循环代码

先明确原代码的核心逻辑:按索引交替添加A的元素和处理后的B元素(B元素为"*"时直接保留,否则调用doSomethingWith()处理),且假设A和B长度一致。基于这个逻辑,给你两种Java 8风格的重构方案:

方案一:用IntStream替代普通for循环(贴近原逻辑)

这种方式只是把传统for循环换成了流的遍历,保留了原有的手动添加逻辑,可读性很高:

String[] A = {"one", "two", "three", "four"};
String[] B = {"five", "six", "seven", "eight"};

List<String> myList = new ArrayList<>(A.length + B.length);
IntStream.range(0, A.length) // 用索引流遍历,确保A和B长度一致
         .forEachOrdered(i -> {
             myList.add(A[i]);
             // 保留原有的B元素处理逻辑
             myList.add("*".equals(B[i]) ? B[i] : doSomethingWith(B[i]));
         });

方案二:函数式风格的流收集(更简洁)

直接通过flatMap把每个索引对应的两个元素转换成流,最终一次性收集成列表,完全脱离手动添加的操作:

String[] A = {"one", "two", "three", "four"};
String[] B = {"five", "six", "seven", "eight"};

List<String> myList = IntStream.range(0, A.length)
                               .boxed()
                               .flatMap(i -> Stream.of(
                                   A[i],
                                   "*".equals(B[i]) ? B[i] : doSomethingWith(B[i])
                               ))
                               // 指定初始容量,和原代码保持一致的性能优化
                               .collect(Collectors.toCollection(() -> new ArrayList<>(A.length + B.length)));

注意:原代码默认A和B长度相同,重构后的代码也依赖这一前提,如果实际场景中两者长度可能不一致,建议改成IntStream.range(0, Math.min(A.length, B.length))来避免索引越界。

内容的提问来源于stack exchange,提问作者raullalves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:11