0

这就是我理解下面的方法 getUser 的方式:

返回一个用户对象或 null

获取一组用户并将他们分配给 userSer。如果集合不为空,则开始迭代集合,但返回集合中的第一个用户。

这是方法:

private User getUser(UserDet arg)
{
    Set<User> userSet = arg.getUsers(User.class);

    if (CollectionUtils.isNotEmpty(userSet))
    {
        for (User user : userSet)
        {
            return user;
        }
    }

    return null;
}

我想我可以用这个替换方法:

private User getUser(UserDet arg)
{
    Set<User> userSet = arg.getUsers(User.class);

    if (CollectionUtils.isNotEmpty(userSet))
    {
        return userSet.iterator().next();
    }
    else {
        return null;
    }
}

这个新方法删除了循环,只返回集合中的第一个元素,与原始实现相同。这是对的吗?

4

8 回答 8

1

是的。实际上,这几乎是一回事,因为 foreach 循环是使用来自Iterable.

但是请注意,您不需要在第一个变体中进行非空检查,因为无论如何循环都不会在空集的情况下进行迭代。

于 2013-10-03T09:52:57.933 回答
0

是的,两者都是一样的。在第一个实现中,控制将在函数的循环的第一次迭代时返回,因此循环将结束。

于 2013-10-03T09:56:03.810 回答
0

是的。这两种方法都返回集合中的第一个元素。第一种方法似乎是以前为其他东西编写的,然后进行了更改,然后保持 for 循环完好无损。

无论如何,您提出的第二种方法不会带来任何显着的性能优势,但应该是比第一种更好的方法。

于 2013-10-03T09:56:19.680 回答
0

是的,它是正确的,我什至会去删除CollectionUtils.isNotEmptySet并使用迭代器的hasNext方法......如果保证集合是非空的。

于 2013-10-03T09:52:23.880 回答
0

这似乎是正确的,但它只会使该方法更易于阅读,不会在性能方面对其进行优化。我仍然认为改变是好的,你应该这样做。

于 2013-10-03T09:52:33.040 回答
0

是的,它的作用几乎相同,但是如果您的规范说要开始迭代,那么也许您应该 - 也许这种方法将来会被扩展。顺便说一句:您的方法只有一个返回语句是一个很好的约定(即您可以创建一个变量,该变量将被返回,在开始时分配一个 null 并在循环内分配一个用户)

于 2013-10-03T09:54:16.813 回答
0

我会这样做。

我不会运行一个循环,更多的是我会添加一个null检查。

 private User getUser(UserDet arg) {
        Set<User> userSet = arg.getUsers(User.class);
        if (userSet != null && userSet.size() > 0) {
            return userSet.iterator().next();
        }
        return null;
    }
于 2013-10-03T09:54:19.317 回答
0

因此,如果UserDet#getUsers(Class)永远不会返回(但如果找不到用户则为null空),最短(并且在我看来最易读)的形式是:Set

private User getUser(UserDet arg) {
    Set<User> userSet = arg.getUsers(User.class);

    return userSet.isEmpty() ? null : userSet.iterator().next();
}
于 2013-10-03T09:56:58.963 回答