在 Reactive X Java 中可观察到的转换集合
Transform Collection observable in Reactive X Java
我有一段代码,使用带有 ReactiveX:
的一对映射语句将 List[VideoDetails] 块转换为 VideoGrid
feedService.loadVideoDetailsFeed(things)
.map(new Func1<List<VideoDetails>, List<Video>>() {
@Override
public List<Video> call(List<VideoDetails> details) {
return Lists.transform(details, new Function<VideoDetails, Video>() {
@Override
public Video apply(VideoDetails input) {
return input.getVideo();
}
});
}
})
.map(new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
//stuff
}
})
如您所见,我在其中一个映射语句中使用了 Guava 转换,以从 List[VideoDetails] 转到 List[Video]。我假设有更好的方法通过 ReactiveX 来完成这种转变?我正在浏览文档的 transforming section,但我可能对 ReactiveX 太陌生,不知道在这里使用什么。
上面的代码片段有效,如果可能的话,我宁愿以正确的方式来做。
您似乎需要保留 VideoInfo 流的缓冲方面才能创建 VideoGrid。因此,如果是这种情况,那么在整个过程中继续使用 Rx 的唯一方法就是不必要地将这些子列表转换为可观察对象,然后 map/transform 内部可观察对象,只是在创建 VideoGrid 时将它们折叠回列表。你现在的做法可能是最务实的。
如果你碰巧用的是Java 8,你可以放弃Guava和里面的class:
return details.stream().map(VideoDetails::getVideo).collect(Collectors.toList());
编辑
这是一种留在 Rx
中的方法
feedService.loadVideoDetailsFeed(things)
.flatMap(new Func1<List<VideoDetails>, Observable<List<Video>>>() {
@Override
public Observable<List<Video>> call(final List<VideoDetails> videoDeets) {
return Observable.from(videoDeets).map(new Func1<VideoDetails, Video>() {
@Override
public Video call(final VideoDetails videoDetails) {
return videoDetails.getVideo();
}
}).toList();
}
})
.map(new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
return VideoGrid.fromListOfVideos(videos);
}
});
这是一种产生更少垃圾的方法。实际的可观察查询更具可读性,但整体代码更多。
private static Func1<VideoDetails, Video> _getVideo = new Func1<VideoDetails, Video>() {
@Override
public Video call(final VideoDetails videoDetails) {
return videoDetails.getVideo();
}
};
private static Func1<List<VideoDetails>, Observable<List<Video>>> _mapVideoDetailsToVideos = new Func1<List<VideoDetails>, Observable<List<Video>>>() {
@Override
public Observable<List<Video>> call(final List<VideoDetails> videoDeets) {
return Observable.from(videoDeets).map(_getVideo).toList();
}
};
private static Func1<List<Video>, VideoGrid> _buildVideoGridFromVideos = new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
return VideoGrid.fromListOfVideos(videos);
}
};
private static void yourFunction(final VideoDeetsSource feedService, String things) {
feedService.loadVideoDetailsFeed(things)
.flatMap(_mapVideoDetailsToVideos)
.map(_buildVideoGridFromVideos);
}
保持 rx 风格你可以使用下面的例子:
编辑
feedService.loadVideoDetailsFeed(things)
.flatMap(new Func1<List<VideoDetails>, Observable<Video>>() {
@Override
public Observable<Video> call(List<VideoDetails> videoDetailsList) {
return Observable.from(videoDetailsList).map(new Func1<VideoDetails, Video>() {
@Override
public Video call(VideoDetails videoDetails) {
return videoDetails.getVideo();
}
});
}
})
.toList();
你可以做什么:
- 从
Observable<List<VideoDetails>>
开始,然后将其转换为 Observable<VideoDetails>
。
- 将此
Observable<VideoDetails>
转换为 Observable<Video>
。
- 最后一步:将
Observable<Video>
转换为 Observable<List<Video>>
。
这对于 RxJava 来说非常容易(使用 Java8 语法)
feedService.loadVideoDetailsFeed(things) // Observable<List<VideoDetails>>
.flapMap(Observable::from) // Observable<VideoDetails>
.map(details -> details.getVideo()) // Observable<Video>
.toList() // Observable<List<Video>>
.map(/* doYourStuff */)
.subscribe();
我有一段代码,使用带有 ReactiveX:
的一对映射语句将 List[VideoDetails] 块转换为 VideoGridfeedService.loadVideoDetailsFeed(things)
.map(new Func1<List<VideoDetails>, List<Video>>() {
@Override
public List<Video> call(List<VideoDetails> details) {
return Lists.transform(details, new Function<VideoDetails, Video>() {
@Override
public Video apply(VideoDetails input) {
return input.getVideo();
}
});
}
})
.map(new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
//stuff
}
})
如您所见,我在其中一个映射语句中使用了 Guava 转换,以从 List[VideoDetails] 转到 List[Video]。我假设有更好的方法通过 ReactiveX 来完成这种转变?我正在浏览文档的 transforming section,但我可能对 ReactiveX 太陌生,不知道在这里使用什么。
上面的代码片段有效,如果可能的话,我宁愿以正确的方式来做。
您似乎需要保留 VideoInfo 流的缓冲方面才能创建 VideoGrid。因此,如果是这种情况,那么在整个过程中继续使用 Rx 的唯一方法就是不必要地将这些子列表转换为可观察对象,然后 map/transform 内部可观察对象,只是在创建 VideoGrid 时将它们折叠回列表。你现在的做法可能是最务实的。
如果你碰巧用的是Java 8,你可以放弃Guava和里面的class:
return details.stream().map(VideoDetails::getVideo).collect(Collectors.toList());
编辑 这是一种留在 Rx
中的方法 feedService.loadVideoDetailsFeed(things)
.flatMap(new Func1<List<VideoDetails>, Observable<List<Video>>>() {
@Override
public Observable<List<Video>> call(final List<VideoDetails> videoDeets) {
return Observable.from(videoDeets).map(new Func1<VideoDetails, Video>() {
@Override
public Video call(final VideoDetails videoDetails) {
return videoDetails.getVideo();
}
}).toList();
}
})
.map(new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
return VideoGrid.fromListOfVideos(videos);
}
});
这是一种产生更少垃圾的方法。实际的可观察查询更具可读性,但整体代码更多。
private static Func1<VideoDetails, Video> _getVideo = new Func1<VideoDetails, Video>() {
@Override
public Video call(final VideoDetails videoDetails) {
return videoDetails.getVideo();
}
};
private static Func1<List<VideoDetails>, Observable<List<Video>>> _mapVideoDetailsToVideos = new Func1<List<VideoDetails>, Observable<List<Video>>>() {
@Override
public Observable<List<Video>> call(final List<VideoDetails> videoDeets) {
return Observable.from(videoDeets).map(_getVideo).toList();
}
};
private static Func1<List<Video>, VideoGrid> _buildVideoGridFromVideos = new Func1<List<Video>, VideoGrid>() {
@Override
public VideoGrid call(List<Video> videos) {
return VideoGrid.fromListOfVideos(videos);
}
};
private static void yourFunction(final VideoDeetsSource feedService, String things) {
feedService.loadVideoDetailsFeed(things)
.flatMap(_mapVideoDetailsToVideos)
.map(_buildVideoGridFromVideos);
}
保持 rx 风格你可以使用下面的例子:
编辑
feedService.loadVideoDetailsFeed(things)
.flatMap(new Func1<List<VideoDetails>, Observable<Video>>() {
@Override
public Observable<Video> call(List<VideoDetails> videoDetailsList) {
return Observable.from(videoDetailsList).map(new Func1<VideoDetails, Video>() {
@Override
public Video call(VideoDetails videoDetails) {
return videoDetails.getVideo();
}
});
}
})
.toList();
你可以做什么:
- 从
Observable<List<VideoDetails>>
开始,然后将其转换为Observable<VideoDetails>
。 - 将此
Observable<VideoDetails>
转换为Observable<Video>
。 - 最后一步:将
Observable<Video>
转换为Observable<List<Video>>
。
这对于 RxJava 来说非常容易(使用 Java8 语法)
feedService.loadVideoDetailsFeed(things) // Observable<List<VideoDetails>>
.flapMap(Observable::from) // Observable<VideoDetails>
.map(details -> details.getVideo()) // Observable<Video>
.toList() // Observable<List<Video>>
.map(/* doYourStuff */)
.subscribe();