这是我的代码:
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
列表,其中一个UserPairModel
由UserPairModel.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));
}