Для варианта использования необходимо работать с типом типа Map<Integer, List<Loan>>
?Таким образом, каждый список будет иметь все предыдущие кредиты .Это означает, что будут избыточные ссылки на Loan
.
. Или это вариант использования для предоставления представлений для loans
, сгруппированный по duration
?
. В таком случае мы можем использовать альтернативный подход:Взгляд на кредиты с использованием Stream
(на основе Java 9 +).
public class Loans {
private final List<Loan> loans;
public Loans(List<Loan> loans) {
this.loans = loans.stream()
.sorted(Comparator.comparingInt(Loan::getDuration))
.collect(Collectors.toList());
}
public Stream<Loan> getUpTo(int duration) {
return loans.stream().takeWhile(l -> l.getDuration() <= duration);
}
}
Поскольку у нас есть List<Loan>
, отсортированный по duration
, мы можем использовать Stream.takeWhile
, чтобы получить Stream
желаемых Loan
с для определенного duration
.
Это работает, например, так:
Loans loans = new Loans(List.of(new Loan("A", 6), new Loan("B", 10), new Loan("C", 12));
loans.getUpTo(1); // <empty>
loans.getUpTo(5); // <empty>
loans.getUpTo(6); // Loan("A", 6)
loans.getUpTo(10); // Loan("A", 6), new Loan("B", 10)
loans.getUpTo(11); // Loan("A", 6), new Loan("B", 10)
loans.getUpTo(12); // Loan("A", 6), new Loan("B", 10), Loan("C", 12)
loans.getUpTo(100); // Loan("A", 6), new Loan("B", 10), Loan("C", 12)
В случае, если необходимо List<Loan>
, мы все равно можем collect
потоковые элементы toList()
.