Как я могу сократить метод с помощью операторов if? - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу сократить этот метод.Не могли бы вы сказать мне, как я могу это сделать?Я пытался как-то, но с плохим результатом.Books длина списка неизвестна.Это может быть 10, но это также может быть 0.Мне нужно 3 книги, если они существуют.

public List<Book> findTheLatest3Books() {
    List<Book> books = new ArrayList<>(bookRepository.findAllByOrderByDateOfCreation());
    List<Book> listOf3LatestBooks = new ArrayList<>();
    if (books.size() >= 3) {
        for (int i = 0; i < 3; i++) {
            if (books.get(i).isAvailable()) {
                listOf3LatestBooks.add(books.get(i));
            }
        }
    }
    if (books.size() == 2) {
        for (int i = 0; i < 2; i++) {
            if (books.get(i).isAvailable()) {
                listOf3LatestBooks.add(books.get(i));
            }
        }
    }
    if (books.size() == 1) {
        for (int i = 0; i < 1; i++) {
            if (books.get(i).isAvailable()) {
                listOf3LatestBooks.add(books.get(i));
            }
        }
    }
    if (books.size() == 0) {
        throw new IllegalArgumentException("No books in DB");
    }
    return listOf3LatestBooks;
}

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Через поток:

List<Book> books = ...    
if (books.isEmpty()) throw new IllegalArgumentException("No books in DB");            
return books.stream() // Stream<Book>
            .limit(3) // truncated to be no longer than 3 in length.
            .filter(Book::isAvailable) // keep only books that are available               
            .collect(Collectors.toCollection(ArrayList::new));

При этом используется поток, усекающий поток, длиной не более 3, а затем фильтры для сохранения доступных книг.

0 голосов
/ 27 декабря 2018

Вы можете применить условие i < 3 && i < books.size() в операторе for:

public List<Book> findTheLatest3Books() {
    List<Book> books = new ArrayList<Book>(bookRepository.findAllByOrderByDateOfCreation());
    List<Book> listOf3LatestBooks = new ArrayList<>();

    for (int i = 0; i < 3 && i < books.size(); i++) {
        if (books.get(i).isAvailable()) {
            listOf3LatestBooks.add(books.get(i));
        }
    }

    if (books.size() == 0) {
        throw new IllegalArgumentException("No books in DB");
    }
    return listOf3LatestBooks;
}
0 голосов
/ 27 декабря 2018

Если books.size() < 3, вы идете с размером, в противном случае вы идете с 3.

if (books.isEmpty()) {
    throw new IllegalArgumentException("No books in DB");
}

final int n = books.size() >= 3 ? 3 : books.size();

for (int i = 0; i < n; ++i) {
    if (books.get(i).isAvailable()) {
        listOf3LatestBooks.add(books.get(i));
    }
}

Похоже, вы используете собственный метод репозитория Spring JPA.Вы можете получить только первые 3 записи, , ограничив результаты запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...