在java中迭代2个列表

798qvoo8  于 2023-01-19  发布在  Java
关注(0)|答案(5)|浏览(140)
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更好的吗?

6ovsh4lw

6ovsh4lw1#

您可以对列表进行流处理,并将流连接为一个流:

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

dldeef672#

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

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

yrefmtwq3#

可以使用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集合的提交者。

6gpjuf90

6gpjuf904#

考虑一下选项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);
    ...
}
imzjd6km

imzjd6km5#

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);
    ...
}

相关问题