2017-05-16 112 views
3

我需要返回某個對象的屬性,我需要在forEach循環內訪問該屬性。基本上我有一個user對象,它有一個屬性List<UserLocation>UserLocation對象是一個Location對象屬性爲location_id。如果user對象上的store_id對象與UserLocation對象上的store_id匹配,那是我需要從中獲取location_id的對象。然而,我得到的問題是它說lambda表達式內使用的變量應該是最終的或有效的最終。見下面的代碼。Java 8forEach從循環內返回屬性

User user = getUser(request); 
Integer locationId; 

user.getUserLocations().forEach(ul -> { 
    if (ul.getStoreId() == user.getStoreId()) { 
     locationId= ul.getUserLocations().getLocationId(); 
    } 
}); 

任何意見或解決方案將不勝感激!

+2

[lambda表達式中使用的變量應該是最終的或有效的最終]的可能重複(http://stackoverflow.com/questions/34865383/variable-used-in-lambda-expression-should-be-final-or-有效 - 最終) –

+0

不幸的是,Java沒有關閉,這就是爲什麼你會遇到編譯錯誤。 – randomUser56789

回答

4

錯誤告訴你到底是什麼問題:你不能從閉包內部分配。你可以變通的作法是使一個可變的容器,一個數組或列表,但更好的方法是使用流的findFirst方法:

Optional<Integer> optLocationId = user.getUserLocations().stream() 
    .filter(ul -> ul.getStoreId() == user.getStoreId()) 
    .findFirst(); 
if (optLocationId.isPresent()) { 
    Integer locationId = optLocationId.get().getUserLocations().getLocationId(); 
} 
1

這是可以做到不forEach更好的,假設你只需要找到一個位置:

Integer locationId = user.getUserLocations() 
         .stream() 
         .filter(ul -> ul.getStoreId() == user.getStoreId()) 
         .findAny() 
         .map(ul -> ul.getLocation().getLocationId()) 
         .orElse (0); // default value in case no match is found 

PS我假設ul.getUserLocations()是一個錯字,而且應該是ul.getLocation(),因爲您寫道inside the UserLocation object is a Location objectgetUserLocations()似乎是User類的一種方法,而不是UserLocation類。