2016-11-03 16 views
0

が、私は基本的に観察可能更新単一のリスト項目RXJava

private static List<Book> books 

public static void replaceBook(Book book) { 
    for (int i = 0; i < books.size(); i++) { 
     if (books.get(i).getId().equals(book.getId())) { 
      books.set(i, book); 
     } 
    } 
} 

にループのためにこれを変換したいこれは私がこれまで持っているものであるが、その作業はありません。私は、マップ演算子は、フィルタリングされた項目を更新すると思ったが、私は何かが欠けているようだ。

Observable.from(books).filter(new Func1<Book, Boolean>() { 
     @Override 
     public Boolean call(Book b) { 
      return b.getId().equals(book.getId()); 
     } 
    }).map(new Func1<Book, Book>() { 
     @Override 
     public Book call(Book b) { 
      return book; 
     } 
    }).subscribe(); 

ボリスとTassosの回答に基づいて更新

私は

Observable.from(books) 
      .map(b -> b.getId().equals(book.getId()) ? book : b) 
      .toList() 
      .subscribe(s -> books = s); 
+0

を動作するように思われる以下の答えを得たあなたは、 'フィルタ' 'リストからいくつかの要素をしたいですか '?リスト内の一部のブックを置き換えてリストを返す? –

+0

リストアイテムを置き換えてリストを返したいと思います。 – sirFunkenstine

答えて

1
Observable 
    .from(books) 
    .map(b -> b.getId().equals(book.getId()) ? book : b) 
    .subscribe(); 
+0

List の書籍は、一度終了しても更新されていないようです。リストのインスタンスを更新するためにsubscribeに何かを追加する必要がありますか? – sirFunkenstine

+0

Rxはジョブに適切なツールではないので、Rxを使用しないでください。Rxはほとんど不変のデータ構造を持つより機能的なスタイルに適しています。それ以外の場合は.toList()を実行します。 –

+0

また、 'books.replaceAll(b - > b.getId()。equals(book.getId())?book:b);' –

2
Observable 
    .from(books) 
    .map(new Func1<Book, Book>() { 
     @Override 
     public Book call(Book b) { 
      if (book.getId().equals(b.getId())) 
       return book; 
      return b; 
     } 
    }) 
    .toList() 
    .subscribe(); 
関連する問題