这是我的代码:

    List<UserModel> reversed = Lists.reverse(Arrays.asList(new UserModel("userId1"), new UserModel("userId2"), new UserModel("userId3"), new UserModel("userId4"));
    List<UserPairModel> result = nwe LinkedList<>();
    IntStream.range(0, reversed.size())
            .filter(idx -> idx % 2 == 0)
            .forEach(idx -> {
                        UserModel userModel1 = null;
                        UserModel userModel2 = null;
                        try {
                            userModel1 = reversed.get(idx - 1);
                        } catch (Exception e) {
                            // do nothing
                        }
                        try {
                            userModel2 = reversed.get(idx);
                        } catch (Exception e) {
                            // do nothing
                        }
                        result.add(UserPairModel.from(userModel1, userModel2));
                    }
            );
    return Lists.reverse(result);
}


目标是将两个UserModel配对为一个UserPairModel源列表,reversed可能包含零个,一个或多个元素。

如果源列表不包含任何元素:输出将是一个result列表,其中一个UserPairModelUserPairModel.from(null, null)之类构造

如果源列表仅包含一个元素,则类似地,result列表将包含一个UserPairModel,其构建方式为UserPairModel.from(notNull, null),这实际上是通过将任意数量的UserModel与2配对而实现的。

在给定四(4)个元素(userId1,userId2,userId3,userId4)的情况下,此代码存在问题,只有最后3个元素存储在result列表中,即2,3和4,跳过了第一个元素。

最佳答案

IntStream.range(0, reversed.size())
            .filter(idx -> idx % 2 == 0)
            .forEach(idx -> {
                UserModel userModel1 = reversed.get(idx);
                UserModel userModel2 = idx + 1 < reversed.size() ? reversed.get(idx + 1) : null;
                result.add(UserPairModel.from(userModel1, userModel2));
            });


或者以更具可读性的形式表示:

for (int idx = 0; idx < reversed.size(); idx += 2) {
    UserModel userModel1 = reversed.get(idx);
    UserModel userModel2 = idx + 1 < reversed.size() ? reversed.get(idx + 1) : null;
    result.add(UserPairModel.from(userModel1, userModel2));
}

07-22 14:28