[英]Iterate over 2 lists in java
List<String> listA = new Arraylist();
List<String> listB = new Arraylist();
鉴于以上 2 个列表,我想在每个元素上迭代并调用相同的方法。
选项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应该是最好的。 有一些 Java 8 lambda 方法可以做到这一点吗? 另外,在性能方面,有什么比选项 1 更好的吗?
您可以流式传输列表并将流连接成一个:
Stream.concat(listA.stream(), listB.stream())
.forEach(elem -> {
someCommonMethodToCall(elem);
someOtherMethodToCall(elem);
});
使用Java 8,您可以使用流:
Stream.concat(listA.stream(), listB.stream())
.forEach(this::someCommonMethodToCall);
您可以使用Stream
的peek
方法进行第一个方法调用,然后执行forEach
:
List<Integer> one = Arrays.asList(1, 2, 3);
List<Integer> two = Arrays.asList(4, 5, 6);
Stream.concat(one.stream(), two.stream())
.peek(System.out::print)
.forEach(System.out::println);
以下内容也可以使用Eclipse Collections tap
方法,后跟forEach
:
List<Integer> one = Arrays.asList(1, 2, 3);
List<Integer> two = Arrays.asList(4, 5, 6);
LazyIterate.concatenate(one, two)
.tap(System.out::print)
.forEach(System.out::println);
您可以使用peek
或tap
链接任意数量的方法调用,但我建议的是提取一个复合方法来进行两个方法调用。
注意:我是Eclipse Collections的提交者。
考虑选项3,DRY方法。 似乎RYL(重复自己少),但它比你目前的做法干燥。
private void doStuff(final String value)
{
someCommonMethodToCall1(value);
someCommonMethodToCall2(value);
...
}
for (final String currentValue: listA)
{
doStuff(currentValue);
...
}
for (final String currentValue: listB)
{
doStuff(currentValue);
...
}
shmosel 答案的一个有趣变体是直接遍历流的迭代器。 就像是:
for (String elem : (Iterable<String>) Stream.concat(listA.stream(), listB.stream())::iterator) {
someCommonMethodToCall(elem);
someCommonMethodToCall(elem);
...
}
不确定它是否更快但确实避免定义内部 lambda 以及创建新数组或复制代码的其他问题。
如果经常使用,我会创建一个实用方法来降低行复杂性, StreamUtils.streamIter()
或其他东西。
for (String elem : streamIter(Stream.concat(listA.stream(), listB.stream()))) {
someCommonMethodToCall(elem);
someCommonMethodToCall(elem);
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.