如何不使用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
相关产品推荐
相关产品推荐

