обновление значения объекта в списке объектов - PullRequest
1 голос
/ 10 марта 2019

Мне нужно обновить поле объекта в списке объектов

У меня есть класс "Книга"

class Book{
   String name ;
   int count;
  ....constructor
  .. getter setters
}

теперь у меня есть метод updateCount

public void updateCount() {
  List<Book> books = new ArrayList<Book>() {
   {
     add(new Book("Book1", 1));
     add(new Book("Book2" , 2));

     // it can be more than 2 and in any manner not in any defined sequence  but we can
     // identify with the book name
   }
}

public static void main(String[] args) {
   /// now i have to update the value of count to 3 in book2
   /// how can I update
}

Если у кого-то есть решение с использованием Java 8. Было бы замечательно

Ответы [ 5 ]

1 голос
/ 10 марта 2019

Вы можете использовать фильтр в поточном списке, а затем просто обновить счет

public void updateCount(String bookName, int updateBy) {
  books.stream().filter(book -> book.getName().equals(bookName)).forEach(
      book -> book.setCount(book.getCount() + updateBy)
  );
}
0 голосов
/ 10 марта 2019

Простой и четкий способ сделать это:

public void updateCount(List<Book> books) {
    books.stream()
         .filter(book -> book.getName().equals("book2"))
         .findFirst()
         .get()
         .setCount(3);
}
0 голосов
/ 10 марта 2019

Метод updateCount, который вы связали, похоже, создает список книг, я не совсем уверен, что вы пытаетесь сделать здесь, но, возможно, этот метод должен вернуть List<Book>, чтобы вы могли создать список книгв вашей основной функции?Если вы сделаете это, то сможете создать новый метод, в котором вы можете передать ему свой список, индекс, который вы хотите обновить в этом списке, и новое значение счетчика для этой книги, что-то вроде этого:

private void updateBookCount(List<Book> books, int booksIndex, int newCount)
{
     if (books.size() > booksIndex)
         books.get(booksIndex).setCount(newCount);
}
0 голосов
/ 10 марта 2019
books.stream().filter(book -> book.getName().equals("book2")).findFirst().get().setCount(3);

Однако он выдаст NoSuchElementException, если book2 не будет в списке.Вот почему вы должны использовать Optional.isPresent() check.

Optional<Book> book2 = books.stream().filter(book -> book.getName().equals("book2")).findFirst();
book2.ifPresent(book -> book.setCount(3));

Обратите внимание, что я ищу только для первого найденного book2.Если вы хотите найти все Book с определенным именем, вы должны использовать синтаксис foreach вместо findFirst.

0 голосов
/ 10 марта 2019

вы можете перебирать список, как показано ниже, а для обновления значения объекта вы можете указать условие или использовать индекс массива в соответствии с вашими потребностями.Предположим, вам нужно обновить книгу по цене от 100 до 7500, вы можете сделать следующее.

for (Book book : books){
  if( book.getPrice() == 100){
       book.setPrice(7500);
  }
}

// if you want to update the book2's number, then
for (Book book: books){
  if( book.getName() == "Book2"){
      book.setNumber(/*set number here*/);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...