将List <T>转换为另一个List <Pair <L,R >>

时间:2019-07-10 03:30:14

标签: java list

将列表转换为另一个列表(例如,以List<T> into another List<Pair<L,R>>的形式)的最佳方法是什么,如图所示:

enter image description here

如图所示,有一个List<UserModel>的源列表,它实际上包含一个UserModelgetUserId()方法的列表,该列表可以为空,包含一个或多个元素),因此这是任意的。目标是创建另一个列表,其中将包含一对字符串用户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

2 个答案:

答案 0 :(得分:2)

您没有提供有关UserModelUserRenderModel类的太多详细信息,但让我们假设您有某种将它们相互转换的方法:

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());
            });