簡體   English   中英

遍歷 java 中的 2 個列表

[英]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);

您可以使用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 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);

您可以使用peektap鏈接任意數量的方法調用,但我建議的是提取一個復合方法來進行兩個方法調用。

注意:我是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM