2017-05-16 11 views
3

私はforEachループ内でアクセスする必要がある特定のオブジェクトのプロパティを返す必要があります。基本的にはList<UserLocation>のプロパティを持ち、UserLocationオブジェクトの内部にオブジェクトがあり、location_idというプロパティを持つLocationオブジェクトです。 userオブジェクトのstore_idが、UserLocationオブジェクトのstore_idと一致する場合は、location_idを取得する必要があります。しかし、私が得ている問題は、ラムダ式の中で使われている変数が最終的に、あるいは効果的に最終的なものでなければならないということです。以下のコードを参照してください。ループ内からプロパティを返すJava 8 forEach

User user = getUser(request); 
Integer locationId; 

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

ご迷惑をおかけして申し訳ございません。

+2

[ラムダ式で使用される変数の可能な重複は、最終的に、または効果的に最終的なものでなければなりません](http://stackoverflow.com/questions/34865383/variable-used-in-lambda-expression-should-be-final-or-実質的に最終的な) –

+0

Javaはクロージャを残念ながら持っていないので、コンパイルエラーが発生します。 – randomUser56789

答えて

4

エラーは、問題が何であるかを正確に示しています。クロージャの内部から割り当てることはできません。あなただけのものを見つける必要があると仮定すると、これはforEachなしでより良い行うことができます

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

:あなたは変更可能なコンテナ、配列またはリストを作ることによってこの問題を回避できますが、より良いアプローチは、ストリームのfindFirstメソッドを使用することです場所:

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あなたはinside the UserLocation object is a Location objectgetUserLocations()Userクラスのメソッドであり、UserLocationクラスではないように書いているので、ul.getUserLocations()はタイプミスで、ul.getLocation()であるはずです。

関連する問題