2015-04-14 97 views
1
final List<String> userIds = request.getUserIds(); 
final List<String> keys = userIds.stream().map(p -> { 
    return removePrefix(p); 
}).collect(Collectors.toList()); 

基本上,userIds列表中的每個關鍵字都包含一個前綴「_user」,我想爲每個關鍵字移除該關鍵字。因此,我在列表中的每個項目上調用removePrefix函數,並將結果存儲在另一個名爲「keys」的列表中。這是Java 8中lambda表達式的正確用法嗎?

回答

6

是的,雖然您可以使用方法參考和靜態進口:

final List<String> keys = userIds.stream() 
           .map(this::removePrefix) 
           .collect(toList()); 
+0

'.map(p - > removePrefix(p))'和'.map(this :: removePrefix)'之間是否有區別。是的,第一個是更長的兩個字符,但還有其他什麼? –

+5

沒有功能差異 - 但我發現方法引用更具可讀性。這顯然是一種品味... – assylias

+0

它會在_byte-code level_中一樣嗎? –

3

@assylias的答案是好的,但如果你不擔心的地方修改列表(和你被允許通過其ListIterator#set方法進行修改),一個很好的替代可能是使用replaceAll

final List<String> userIds = request.getUserIds(); 
userIds.replaceAll(this::removePrefix); 

replaceAll在這裏工作,因爲你的功能是從T到T(其中T是String在你的情況)功能,所以基本上UnaryOperator,這是一個Function<T,T>

如果你想要應用的映射應該是從T到U的類型,那麼獲取列表流並通過Stream#map方法進行映射(就像你做的那樣)是標準習慣用法。