Коллекция пересечения Java

Я хотел бы найти элегантный способ для этого:

У меня есть две коллекции A и B, если они обе не пусты, то мне нужно сделать пересечение (сохранить общие элементы в другом списке).

Если один из них пуст, мне придется взять все элементы другого.

Если оба они пусты, результирующая коллекция будет пустой.

Есть ли способ решить эту проблему, не используя много условий и с хорошей производительностью?

Это работает, но это не так приятно:

import org.apache.commons.collections4.CollectionUtils;
...
...
    List<Long> listA = new ArrayList<Long>();
    List<Long> listB = new ArrayList<Long>();
    //initialisation list A & listB

    List<Long> outputList = null;
    if(listA.size()>0 && listB.size() >0) {
        outputList = new ArrayList(CollectionUtils.intersection(listB, listA));
    }
    else if(listA.size()==0){
        outputList = listB;
    }
    else if(listB.size()==0){
        outputList = listA;
    }

Спасибо!

2 ответа

Я не представляю, просто из-за вашего состояния:

Если один список пуст, верните другой список.

Это не типичное определение пересечения, и я не уверен, что это обычная операция, описанная в стандартной библиотеке. Таким образом, вам придется справиться с этой логикой самостоятельно.

Если вы действительно хотите избавиться от операторов if, вы можете использовать троичный оператор:

return listA.isEmpty() ? listB :
       listB.isEmpty() ? listA :
       new ArrayList(CollectionUtils.intersection(listB, listA));

У вас есть конкретные требования для каждой возможной комбинации пустых и непустых входных наборов. Вполне естественно, что у вас есть несколько if заявления, чтобы выделить случаи и ответить в соответствии с вашими требованиями. Обойти это невозможно.

Но ваше решение можно немного улучшить:

  • это более идиоматично в использовании .isEmpty() вместо сравнения размера с 0
  • ты забыл else заявление, и это обработка пусто-пустого дела

Исправляя эти проблемы, код становится:

final List<Long> outputList;
if (!listA.isEmpty() && !listB.isEmpty()) {
    outputList = new ArrayList(CollectionUtils.intersection(listB, listA));
}
else if (listA.isEmpty()) {
    outputList = listB;
}
else if (listB.isEmpty()) {
    outputList = listA;
} else {
    outputList = Collections.emptyList();
}
Другие вопросы по тегам