List<String> listA = new Arraylist();
List<String> listB = new Arraylist();
给定上面的两个列表,我想迭代并在每个元素上调用相同的方法。
- 备选案文1**
for(String aStr: listA){
someCommonMethodToCall(aStr);
someCommonMethodToCall(aStr);
...
}
for(String bStr: listB){
someCommonMethodToCall(bStr);
someCommonMethodToCall(bStr);
...
}
或
- 备选案文2**
List<String> mergedList = new ArrayList();
mergedList.addAll(listA);
mergedList.addAll(listB);
for(String elem: mergedList){
someCommonMethodToCall(elem);
someCommonMethodToCall(elem);
...
}
或
- 备选案文3**
我觉得选项1应该是最好的。有没有一些Java8lambda方法可以做到这一点?还有,性能方面,有什么比选项1更好的吗?
5条答案
按热度按时间6ovsh4lw1#
您可以对列表进行流处理,并将流连接为一个流:
dldeef672#
使用Java 8,您可以使用流:
yrefmtwq3#
可以使用
Stream
的peek
方法进行第一次方法调用,然后调用forEach
:使用Eclipse Collections
tap
方法,然后使用forEach
方法,也可以执行以下操作:您可以使用
peek
或tap
链接任意多个方法调用,但我建议提取一个复合方法,该方法同时进行这两个方法调用。注意:我是Eclipse集合的提交者。
6gpjuf904#
考虑一下选项3,一个干燥的方法。它看起来像RYL(少重复自己),但它比你现在的方法更干燥。
imzjd6km5#
shmosel的答案的一个有趣的变体是直接在流的迭代器上循环。
不确定它是否更快,但确实避免了定义内部lambda以及创建新数组或复制代码的其他问题。
如果经常使用,我会创建一个实用方法来降低行复杂度,
StreamUtils.streamIter()
之类的。