Java:如何将BigDecimal值添加​​到MAP中存储的Collection中

问题描述

任务是练习收集并且不使用流。 有一些类似图书馆的基本功能:我们有读者,书籍和有关借书的信息。 有4个类别/记录,其中包括

public record Book(String title,String author,BigDecimal priceForKeepingLonger) {} 
public record Reader(String name,String lastName,int age,BigDecimal fineAmount) {}
public record Borrowing(Book book,Reader reader,LocalDate borrowingDate) {}
psvm

任务:

  • 创建一个具有以下内容的地图:密钥:读者,作为值:可使图书长期保存(超过14天)的罚款金额。
  • 一个用户可以预订多于一本书。

问题:

  • 我必须增加每位用户的罚款额,但我不能这样做。我有一种方法,可以每本书分别计数。.

请您帮忙。 下面的主类(我在这里比较新鲜,所以希望数据/代码量足够):

public class Main {

static BigDecimal countFine(Borrowing borrowing){

    if(borrowing == null){
        throw new IllegalArgumentException("Borrowing collections is null");
    }
    LocalDate todaysDate = LocalDate.Now();
    BigDecimal sum = BigDecimal.ZERO;
    long howManyDaysBookIsBorrowedAlready = -ChronoUnit.DAYS.between(todaysDate,borrowing.borrowingDate());
    BigDecimal amountOfDaysMinus14 = BigDecimal.valueOf(howManyDaysBookIsBorrowedAlready).subtract(BigDecimal.valueOf(14));
    if (howManyDaysBookIsBorrowedAlready <=14){
        sum = BigDecimal.ZERO;
    }
    else{
        sum = sum.add(BigDecimal.valueOf(5).multiply(amountOfDaysMinus14));
        if(borrowing.reader().age() <18){
            sum = sum.divide(BigDecimal.valueOf(2));
        }
    }
    return sum;
}


public static Map<Reader,BigDecimal> createMapReaderWithAMountOfFines(Set<Borrowing> borrowings){

    if(borrowings == null){
        throw new IllegalArgumentException("Borrowing set collections cannot be null");
    }
    Map<Reader,BigDecimal> readerWithAMountOfFines = new HashMap<>();

    borrowings.forEach(borrowing -> {

        if(readerWithAMountOfFines.containsKey(borrowing.reader())){

            readerWithAMountOfFines.get(borrowing.reader()).add(countFine(borrowing));
        }
        else {
            readerWithAMountOfFines.put(borrowing.reader(),countFine(borrowing));
        }
    } );
    return readerWithAMountOfFines;
}

public static void main(String[] args) {
    Reader r1 = new Reader("Tomasz","Knapik",21,BigDecimal.ZERO);
    Reader r2 = new Reader("Adrian",16,BigDecimal.ZERO);
    Reader r3 = new Reader("Tomasz","Kamel",29,BigDecimal.ZERO);
    Reader r4 = new Reader("Ala","Drag",18,BigDecimal.ZERO);
    Reader r5 = new Reader("Ola","Was",28,BigDecimal.ZERO);
    Reader r6 = new Reader("Ola","Chrzaszcz",35,BigDecimal.ZERO);
    HashSet<Reader> readers = new HashSet<>();
    Collections.addAll(readers,r1,r2,r3,r4,r5,r6);

    Book b1 = new Book("Przedwiosnie","Zeromski",new BigDecimal("5"));
    Book b2 = new Book("Pan Tadeusz","Mickiewicz",new BigDecimal("8"));
    Book b3 = new Book("Kordian",new BigDecimal("5"));
    Book b4 = new Book("Potop","Sienkiewicz",new BigDecimal("10"));
    Book b5 = new Book("Lalka","Prus",new BigDecimal("5"));
    HashSet<Book> books = new HashSet<>();
    Collections.addAll(books,b1,b2,b3,b4,b5);

    Borrowing w1 = new Borrowing(b1,LocalDate.of(2020,7,1));
    Borrowing w2 = new Borrowing(b1,8,1));
    Borrowing w3 = new Borrowing(b2,20));
    Borrowing w4 = new Borrowing(b5,1));
    Borrowing w5 = new Borrowing(b5,1));
    Borrowing w6 = new Borrowing(b4,20));
    Borrowing w7 = new Borrowing(b4,6,1));
    Borrowing w8 = new Borrowing(b3,18));
    HashSet<Borrowing> wypozyczenia = new HashSet<>();
    Collections.addAll(wypozyczenia,w1,w2,w3,w4,w5,w6,w7,w8);

    Map<Reader,BigDecimal> readerWithAMountOfFines = createMapReaderWithAMountOfFines(wypozyczenia);
    readerWithAMountOfFines.forEach((k,v) -> System.out.println(k + " " + v));





}

解决方法

要对读者罚款的地方,您需要记住 BigDecimal.add方法返回总和,它不会修改现有值。

因此,要将新罚款添加到现有罚款中,您需要检索现有罚款,添加新罚款并将结果存储回readerWithAMountOfFines中:

BigDecimal existingFineAmount = readerWithAMountOfFines.get(borrowing.reader());
BigDecimal newFineAmount = existingFineAmount.add(countFine(borrowing));
readerWithAMountOfFines.put(borrowing.reader(),newFineAmount);
,

我在这里使用合并方法找到了另一个解决方案

public static Map<Reader,BigDecimal> createMapReaderWithAMountOfFines(Set<Borrowing> borrowings){

    if(borrowings == null){
        throw new IllegalArgumentException("Borrowing set collections cannot be null");
    }
    Map<Reader,BigDecimal> readerWithAMountOfFines = new HashMap<>();

    borrowings.forEach(borrowing -> {

        if(readerWithAMountOfFines.containsKey(borrowing.reader())){
            
            readerWithAMountOfFines.merge(borrowing.reader(),countFine(borrowing),BigDecimal::add);
        }
        else {
            readerWithAMountOfFines.put(borrowing.reader(),countFine(borrowing));
        }
    } );
    return readerWithAMountOfFines;
}