在java中迭代2个列表

在java中迭代2个列表,java,loops,java-8,Java,Loops,Java 8,或 选项2 for(String aStr: listA){ someCommonMethodToCall(aStr); someCommonMethodToCall(aStr); ... } for(String bStr: listB){ someCommonMethodToCall(bStr); someCommonMethodToCall(bStr); ... } List mergedList=new ArrayList(); merg

选项2

for(String aStr: listA){
    someCommonMethodToCall(aStr);
    someCommonMethodToCall(aStr);
    ...
}
for(String bStr: listB){
    someCommonMethodToCall(bStr);
    someCommonMethodToCall(bStr);
    ...
}
List mergedList=new ArrayList();
mergedList.addAll(listA);
mergedList.addAll(listB);
for(字符串元素:合并列表){
一些常用方法调用(elem);
一些常用方法调用(elem);
...
}

选项3


我觉得选择1应该是最好的。有什么Java8Lambda方法可以做到这一点吗?此外,从性能角度来看,还有什么比选项1更好的吗?

您可以将列表和数据流合并为一个:

List<String> mergedList = new ArrayList();
mergedList.addAll(listA);
mergedList.addAll(listB);

for(String elem: mergedList){
    someCommonMethodToCall(elem);
    someCommonMethodToCall(elem);
    ...
}

使用Java 8,您可以使用流:

Stream.concat(listA.stream(), listB.stream())
    .forEach(elem -> {
        someCommonMethodToCall(elem);
        someOtherMethodToCall(elem);
    });
考虑备选方案3, 枯燥的方法。 这似乎是RYL(少重复你自己),但它比你目前的方法更干燥

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

您可以使用
流的
peek
方法进行第一次方法调用,然后使用
forEach

private void doStuff(final String value)
{
    someCommonMethodToCall1(value);
    someCommonMethodToCall2(value);
    ...
}

for (final String currentValue: listA)
{
    doStuff(currentValue);
    ...
}

for (final String currentValue: listB)
{
    doStuff(currentValue);
    ...
}
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);
您可以使用
peek
tap
根据需要链接任意多个方法调用,但我建议您提取一个复合方法,该方法可以同时进行两个方法调用


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

这绝对是Java 8方式。我认为它的性能会比选项1慢。你觉得呢?这是可能的。这真的没关系:老实说,选一个就行了。性能差异不太重要,所以选择对您来说最合适的一个。它的性能会更慢,是的,因为除了concat的成本外,lambda还增加了对象创建成本和另一个间接级别(lambda是一个带有.apply()方法的对象,在调用该方法时,会调用一些common和其他方法)。但实际性能的影响将是可以忽略的,除非这是一些经常被称为内部循环。在大多数情况下,这样做是因为代码更简单、更清晰。另一种选择是将共享代码分解到一个方法中,并调用该方法。对于我认为将有少量元素的列表,for循环和stream for list之间的性能考虑是浪费时间。如果该列表应该包含数百万项,则应在问题中明确说明该列表以及性能预期。
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);
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);