Map<InvoiceItemAllocationData, BigDecimal> sortedItemWithRemaining = invoice.getInvoiceItems().stream()
.filter(ii -> invoiceAmountCalculationService.calculateRemainingAmount(ii).signum() != 0)
.collect(Collectors.toMap(Function.identity(), ii -> invoiceAmountCalculationService.calculateRemainingAmount(ii)))
.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (value, duplicate) -> value, LinkedHashMap::new));