Преобразовать список <T>в другой список <Pair <L, R >> - PullRequest
0 голосов
/ 10 июля 2019

Как лучше всего преобразовать Список в другой Список (например, в форме List<T> into another List<Pair<L,R>>), как показано на схеме:

enter image description here

Как показано, существует список источников, который является List<UserModel>, который по существу содержит UserModel с методом getUserId(), этот список может быть либо пустым, содержит один или несколько элементов), поэтому он является произвольным. Цель состоит в том, чтобы создать еще один список, в котором он будет содержать пару идентификаторов пользователя строки.

Вот код, обозначающий проблему;

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 ]

2 голосов
/ 10 июля 2019

Вы не предоставили слишком много подробностей о классах 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());
0 голосов
/ 10 июля 2019

Решение сделать

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());
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...