Постановка задачи: допустим, у меня есть список объектов PriceRow (productCode, key, sector)
List<PriceRow> priceRowList = new ArrayList<>();
priceRowList.add(new PriceRow("10kgbag","", "SECTOR"));
priceRowList.add(new PriceRow("10kgbag","12345", ""));
priceRowList.add(new PriceRow("10kgbag","", ""));
priceRowList.add(new PriceRow("20kgbag","", "SECTOR"));
priceRowList.add(new PriceRow("20kgbag","12345", ""));
priceRowList.add(new PriceRow("20kgbag","", ""));
priceRowList.add(new PriceRow("30kgbag","", "SECTOR"));
priceRowList.add(new PriceRow("30kgbag","", ""));
priceRowList.add(new PriceRow("40kgbag","", ""));
priceRowList.add(new PriceRow("50kgbag","", ""));
Теперь мне нужно сгруппировать его по productCode , а затем отсортироватьэто на основе первого ключа , затем сектора , если обе строки недоступны, возьмите строку с (ключ = пусто) и (сектор = пусто) и возьмите первую строку из отсортированного списка, чтобы создать карту
Следовательно, окончательные утверждения должны выглядеть следующим образом:
assertEquals("12345",map.get("10kgbag").getFlightKey());
assertEquals("12345",map.get("20kgbag").getFlightKey());
assertEquals("SECTOR",map.get("30kgbag").getSector());
assertEquals("",map.get("40kgbag").getFlightKey());
assertEquals("",map.get("50kgbag").getFlightKey());
Решение, которое я придумал:
import org.apache.commons.lang.StringUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Example {
public Map<String,PriceRow> evaluate(List<PriceRow> priceRowList) {
Map<String,PriceRow> map = priceRowList.stream()
.collect(Collectors.groupingBy(priceRow -> priceRow.getProductCode(),
Collectors.collectingAndThen(Collectors.toList(), value -> getMostEligibleValue(value))));
return map;
}
private PriceRow getMostEligibleValue(List<PriceRow> priceRowList){
for(PriceRow priceRowWithKey : priceRowList)
if(StringUtils.isNotBlank(priceRowWithKey.getKey()))
return priceRowWithKey;
for(PriceRow priceRowWithSector : priceRowList)
if(StringUtils.isNotBlank(priceRowWithSector.getSector()))
return priceRowWithSector;
return priceRowList.stream().findFirst().get();
}
}
НадеждаЯ могу объяснить постановку проблемы.Если есть какие-либо лучшие решения для этой проблемы, пожалуйста, дайте мне знать.Заранее благодарим за помощь.