2017-02-10 1 views
3
Set <ShipperModel> shippers = baseSiteSerivce.getCurrentBaseSite().getStores().get(0).getShippers();   
final List<KeyValueStoreModel> kvList = keyValueStoreService.getKeyValueStoreModelListByCode(HERITAGEUNIT_DELIVERYINSTRUCTION_SHIPVIA); 

for (ShipperModel shipperModel : shippers) 
{ 
    for (KeyValueStoreModel keyValueStoreModel : kvList) 
    { 
     if(shipperModel.getCode().equals(keyValueStoreModel.getCode())) 
     { 
      // if codes are equals then it will remain in the kvList. 
     } 
    } 
} 

У меня есть два списка элементов и на основе грузоотправителей я хочу, чтобы фильтровать kvlist Я хочу, чтобы выполнить операцию как kvlist.remainAll(shipper(based on code)) и хотят конвертировать эти циклы для потокового кода.Как заменить две петли с использованием потоков и остаются элементы в списке, которые же

+0

Пожалуйста, взгляните на этот [ответ] (http://stackoverflow.com/a/29342714/1530987) – crowchirp

+0

Вы не можете преобразовать ShipperModel в набор или карту с кодом в нем? – Zeromus

+0

@Zeromus нет, я не могу. – Devendra

ответ

5

Не идеально, но это вы можете попробовать сделать что-то вроде:

List<KeyValueStoreModel> filtered = kvlist.stream().filter(
     kv -> shippers.stream().anyMatch(
       s -> s.getCode().equals(kv.getCode()) 
      ) 
    ) 
).collect(Collectors.toList()); 

Таким образом, мы получаем Stream кВ элементы, чем мы проверяем, есть ли соответствующий элемент в грузоотправителях Set и, наконец, мы собираем совпадающие элементы в новый List.

2

Если вы хотите изменить существующую коллекцию, то лучше использовать Collection.removeIf:

kvList.removeIf(model -> shippers.stream().map(ShipperModel::getCode) 
           .noneMatch(model.getCode()::equals)); 

Здесь мы проходим условие: мы удаляем только те элементы, которые не имеют соответствующего кода в shippers.

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

Set<Code> shipperCodes = shippers.stream().map(ShipperModel::getCode) 
           .collect(Collectors.toSet()); 
kvList.removeIf(model -> !shipperCodes.contains(model.getCode())); 

Таким образом, стоимость алгоритма падает из O (N * M) до O (N + M), где N и M - количество грузоотправителей и моделей соответственно.

Смежные вопросы