将列表转换为另一个列表(例如,以List<T> into another List<Pair<L,R>>
的形式)的最佳方法是什么,如图所示:
如图所示,有一个List<UserModel>
的源列表,它实际上包含一个UserModel
和getUserId()
方法的列表,该列表可以为空,包含一个或多个元素),因此这是任意的。目标是创建另一个列表,其中将包含一对字符串用户ID。
这里是概述问题的代码;
List<UserModel> models= getUsers();
List<UserRenderModel> renderModels = new LinkedList<>();
IntStream.range(0, models)
.forEach(idx -> {
UserRenderModel renderModel = new UserRenderModel();
UserModel dataModel = models.get(idx);
if(idx % 2 == 0) {
renderModel.setLeftUserId(dataModel.getUserId());
} else {
renderModel.setRightUserId(dataModel.getUserId());
}
renderModels.add(renderModel);
}
);
在这段代码中,您可以看到,如果我们有一个UserModel
且集合中有两个对象,它将创建两个UserRenderModel
并将其添加到renderModels集合中,这是错误的,而它应该只是成为UserRenderModel
答案 0 :(得分:2)
您没有提供有关UserModel
和UserRenderModel
类的太多详细信息,但让我们假设您有某种将它们相互转换的方法:
private static UserRednerModel toRenderModel(UserModel u) {
// pseudocode, of course:
String leftUserId = getLeftIdFromId(u.getId());
String RIGHTUserId = getRightIdFromId(u.getId());
return new UserRenderModel(leftUserId, rightUserId);
}
鉴于这种方法,我将流UserModel
的列表,将每个映射到UserRenderModel
并将其收集到新列表:
List<UserModel> myList = ...;
List<UserRenderModel> result =
myList.stream()
.map(SomeClass::toRenderModel)
.collect(Collectors.toList());
答案 1 :(得分:0)
解决方案是要做的
IntStream.range(0, models.size())
.filter(idx -> idx % 2 == 0)
.forEach(idx -> {
UserModel userModel1 = models.get(idx);
UserModel userModel2 = idx + 1 < models.size() ? models.get(idx + 1) : null;
UserRenderModel renderModel = new UserRenderModel();
renderModel.setLeftUserId(userModel1.getUserId());
renderModel.setRightUserId(userModel2.getUserId());
});