2013-10-03 49 views
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; 
} 

我想我可以用這個替代方法:

​​

這種新方法消除了環路和剛剛返回的第一個元素的集合,同作爲原始實施。這是對的嗎?

+0

是。您也可以刪除其他。 – isnot2bad

+0

'arg.getUsers(User。類);'從數據庫返回,你想從這裏得到什麼? –

+0

是的,正確的。順便說一下,for-each循環被轉換爲與迭代器方法相同的代碼。使用return in for循環在這種情況下是錯誤的,您的版本是正確的:) –

回答

0

是的兩者都是相同的。在第一個實現中,控制將從函數返回循環的第一次迭代,因此循環將結束。

0

是的,這是正確的,我甚至會去除CollectionUtils.isNotEmptySet並使用迭代器的hasNext方法...如果該集合保證爲非空。

0

這似乎是正確的,但它只會使該方法更容易閱讀,它不會在性能方面對其進行優化。儘管如此,我認爲改變是好的,你應該這樣做。

1

是的。實際上,它幾乎是一樣的,因爲foreach循環是使用來自Iterable的迭代器的語法糖。

但是,請注意,您不需要第一個變體中的非空檢查,因爲無論如何循環都不會迭代空集。

+0

我認爲它可能在那裏,因爲這個集合可以是null。 – fortran

+0

@fortran:恕我直言,任務的措辭暗示該集合總是非''null',但我不會爭辯。不過,簡單的空檢查會更快。 –

+0

我同意空檢查會更快,但你知道'null'會發生什麼......一旦你開始在一個地方返回它,它會傳播所有代碼; – fortran

0

是的,它幾乎相同,但如果你的規範說要開始迭代,那麼也許你應該 - 也許這種方法將在未來擴展。 BTW:這是一個好習慣,你的方法只有一個return語句(即你可以創建一個變量,它會被退回,一開始分配null,併爲其分配一個用戶你的循環內)

+1

如果你只需要一次迭代,循環仍然需要'bre​​ak'。單一的return語句比單一的變量賦值更糟糕的經驗法則。 – fortran

+0

是的,在這裏需要'休息'。你能解釋一下var的單個賦值嗎? Thx – FazoM

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; 
    } 
+1

我不認爲在[set interface]中有一個get(http://docs.oracle.com/javase/7/docs/api/java/util/Set.html) –

+1

Set沒有索引訪問。 – fortran

+0

對不起,我的錯誤。編輯。錯誤的是它是'List'。 –

0

是的。這兩個方法都返回集合中的第一個元素。第一種方法似乎是爲以前的其他功能編寫的,然後進行更改,然後保持for循環完好無損。

無論如何,你提出的第二種方法不會給任何顯着的性能好處,但應該是比第一種更好的方法。

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