Java 更新方法以删除循环

Java 更新方法以删除循环,java,Java,以下是我对getUser方法的理解: 返回用户对象或null 获取一组用户并将其分配给userSer。 如果集合不是空的,则开始迭代集合,但 返回集合中的第一个用户 方法如下: private User getUser(UserDet arg) { Set<User> userSet = arg.getUsers(User.class); if (CollectionUtils.isNotEmpty(userSet)) { for (User

以下是我对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 userSet=arg.getUsers(User.class);
if(CollectionUtils.isNotEmpty(userSet))
{
for(用户:userSet)
{
返回用户;
}
}
返回null;
}
我想我可以用以下方法代替该方法:

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

    if (CollectionUtils.isNotEmpty(userSet))
    {
        return userSet.iterator().next();
    }
    else {
        return null;
    }
}
private User getUser(UserDet arg)
{
Set userSet=arg.getUsers(User.class);
if(CollectionUtils.isNotEmpty(userSet))
{
返回userSet.iterator().next();
}
否则{
返回null;
}
}

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

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

这似乎是正确的,但它只会使方法更易于阅读,不会在性能方面对其进行优化。不过我还是觉得这个改变很好,你应该去做。

是的。实际上,这几乎是一样的,因为foreach循环是使用
Iterable
中的迭代器的语法糖


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

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

我不会运行循环,我会添加一个
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;
    }
private User getUser(UserDet arg){
Set userSet=arg.getUsers(User.class);
if(userSet!=null&&userSet.size()>0){
返回userSet.iterator().next();
}
返回null;
}

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

是的。这两个方法都返回集合中的第一个元素。第一个方法似乎是以前为其他方法编写的,并在保持for循环完整的情况下进行了更改

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

因此,在这种情况下,
UserDet\getUsers(Class)
永远不会返回
null
(但如果找不到用户,则返回一个空的
集),最短的(在我看来也是最可读的)表格为:

private User getUser(UserDet arg){
Set userSet=arg.getUsers(User.class);
返回userSet.isEmpty()?null:userSet.iterator().next();
}

是。您还可以删除else。
arg.getUsers(User.class)从数据库返回,您希望从中得到什么?是,正确。顺便说一句,for-each循环被转换为与迭代器方法相同的代码。在这种情况下,使用for循环中的return是错误的,您的版本是正确的:)为什么不测试它,然后查看结果呢?因此,您可以确定它是否有效。除了CollectionUtils.isNotEmpty(userSet)之外,您还可以编写:!userSet.isEmpty()(假设userSet不是null)我认为它可能存在,因为集合可以是
null
@fortran:IMHO任务的措辞意味着集合始终是非
null
,但我不会争辩。不过,简单的空检查会更快。我同意空检查会更快,但你知道
null
会发生什么。。。一旦您开始在一个地方返回它,它就会在所有代码中传播;)@fortran:幸运的是,在这种情况下,foreach会呕吐;)。但是就像我说的,我并不反对额外的检查。我不认为有一个get-in-Set没有索引访问。对不起,伙计们,我的错误。编辑。错误地认为它是
列表
。如果只需要一次迭代,循环仍然需要
中断
。单返回语句是比单变量赋值更糟糕的经验法则。是的,这里需要“break”。你能更详细地解释var的单一赋值吗?谢谢
private User getUser(UserDet arg) {
    Set<User> userSet = arg.getUsers(User.class);

    return userSet.isEmpty() ? null : userSet.iterator().next();
}