[解決済み] RxJavaでmapとflatMapはいつ使うの?
2022-04-24 17:21:20
質問
どのような場合に
map
対
flatMap
で
RxJava
?
例えば、JSONを含むファイルをJSONを含む文字列にマップしたいとします。
使用方法
map
を処理する必要があります。
Exception
どうにかして でも、どうやって?
Observable.from(jsonFile).map(new Func1<File, String>() {
@Override public String call(File file) {
try {
return new Gson().toJson(new FileReader(file), Object.class);
} catch (FileNotFoundException e) {
// So Exception. What to do ?
}
return null; // Not good :(
}
});
使用方法
flatMap
の連鎖の下に問題を転送することができます。
Observables
を選択し、他の場所でエラーを処理し、再試行することもできます。
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(final File file) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override public void call(Subscriber<? super String> subscriber) {
try {
String json = new Gson().toJson(new FileReader(file), Object.class);
subscriber.onNext(json);
subscriber.onCompleted();
} catch (FileNotFoundException e) {
subscriber.onError(e);
}
}
});
}
});
のシンプルさが好きです。
map
のエラー処理に問題があります。
flatmap
(冗長性ではなく)。この件に関するベストプラクティスを見たことがないので、実際にどのように使われているのか気になります。
どのように解決するのか?
map
あるイベントを別のイベントに変換する。
flatMap
1つのイベントを0以上のイベントに変換します。(これは
イントロToRx
)
jsonをオブジェクトに変換したいので、mapを使用すれば十分でしょう。
FileNotFoundExceptionへの対処は別の問題です(mapやflatmapを使用してもこの問題は解決されないでしょう)。
例外の問題を解決するには、チェックされていない例外を投げればよいのです。RXはあなたのためにonErrorハンドラを呼び出します。
Observable.from(jsonFile).map(new Func1<File, String>() {
@Override public String call(File file) {
try {
return new Gson().toJson(new FileReader(file), Object.class);
} catch (FileNotFoundException e) {
// this exception is a part of rx-java
throw OnErrorThrowable.addValueAsLastCause(e, file);
}
}
});
全く同じバージョンで、flatmapを使用したもの。
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(File file) {
try {
return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
} catch (FileNotFoundException e) {
// this static method is a part of rx-java. It will return an exception which is associated to the value.
throw OnErrorThrowable.addValueAsLastCause(e, file);
// alternatively, you can return Obersable.empty(); instead of throwing exception
}
}
});
また、flatMap版では、単なるエラーである新しいObservableを返すことができます。
Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
@Override public Observable<String> call(File file) {
try {
return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
} catch (FileNotFoundException e) {
return Observable.error(OnErrorThrowable.addValueAsLastCause(e, file));
}
}
});
関連
-
SpringBootApplication を型解決できない。
-
javaでクラスを作成すると、enclosing classでないように見える
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
ファインバグタイプ
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
jd-gui Java Exceptionが発生しました。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策