在java中迭代2个列表

时间:2017-08-28 20:48:48

标签: java loops java-8

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更好吗?

4 个答案:

答案 0 :(得分:7)

您可以流式传输列表并将流连接成一个:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

您可以使用peek的{​​{1}}方法进行第一次方法调用,然后使用Stream

forEach

以下内容也可以使用Eclipse Collections 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); 方法,后跟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根据需要链接任意数量的方法调用,但我建议提取一个复合方法来进行两个方法调用。

注意:我是Eclipse Collections的提交者。

答案 3 :(得分: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);
    ...
}