使用`IntStream`分两步进行迭代

时间:2019-07-10 20:36:11

标签: java

这是我的代码:

synchronize

目标是将两个 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列表,其中一个resultUserPairModel

构造

如果源列表仅包含一个元素,则类似地,UserPairModel.from(null, null)列表将包含一个result,其构建方式为UserPairModel,实际上,这里实现了将任何对象配对UserPairModel.from(notNull, null)的数量乘以2。

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

1 个答案:

答案 0 :(得分:1)

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