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