2017-08-28 63 views
2
List<String> listA = new Arraylist(); 
List<String> listB = new Arraylist(); 

鉴于上述2个列表,我想在每个元素上迭代并调用相同的方法。遍历java中的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更好吗?

回答

7

你可以串流播放列表和Concat的流进一个:

Stream.concat(listA.stream(), listB.stream()) 
    .forEach(elem -> { 
     someCommonMethodToCall(elem); 
     someOtherMethodToCall(elem); 
    }); 
+0

这绝对是Java 8的方式。我认为它的表现会比方案1慢。你怎么看? – Ankush

+5

这是可能的。这真的没有关系:说实话,只需选择一个。性能差异不太可能重要,所以请选择最适合您的方式。 –

+0

它的性能会变慢,是的,因为除了concat的开销之外,lambda增加了一个对象创建成本和另一个间接级别(lambda是一个带有.apply()方法的对象,当调用时,调用someCommon和其他一些)。但是实际的性能命中将是微不足道的,除非这是一个经常被称为内部循环。在大多数情况下,你会这样做,因为代码更简单,更清晰。另一种选择是将共享代码分解为一个方法,然后调用该方法。 – tpdi

4

与Java 8,你可以使用流:

Stream.concat(listA.stream(), listB.stream()) 
     .forEach(this::someCommonMethodToCall); 
0

考虑选3, 以干重的方法。 看起来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); 
    ... 
} 
2

您可以使用Streampeek方法的第一个方法调用,然后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 Collectionstap方法,接着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); 

您可以根据需要链接尽可能多的方法调用peektap但我会建议提取一个复合方法,使这两个方法调用。

注意:我是Eclipse集合的提交者。