티스토리 뷰
반응형
Local variable userId defined in an enclosing scope must be final or effectively final
long userId = -1;
if(...){
userId = updateUser();
}else{
userId = insertUser();
}
userList.removeIf(t->t.getUserID()==userId);
위처럼 람다식을 사용하려다가 에러가 났다. removeIf 안의 userId변수가 final 이거나 effectively final이여야 한다고 한다.
이유를 찾아보았다.
람다식에서는 다른 스레드에서 호출될때 변수가 스택영역에서 사라질것을 대비하여 자유변수의 복사본을 만들어 접근을 허용하도록 하게 한다. 이를 람다 캡쳐링(capturing lambda)라고 한다.
람다 캡쳐링을 하고 나서 변수가 변경되면 자유 변수 참조 값의 동기(Sync)를 맞출수 없다.
그래서 final을 쓰도록 컴파일러가 컴파일 에러를 낸다.
결국, 위 코드는 아래처럼 if문 안에 람다식을 넣어 final 변수를 이용하긴 했지만, 마음에 들지는 않는다....
if(...){
final long userId = updateUser();
userList.removeIf(t->t.getUserID()==userId);
}else{
final long userId = insertUser();
userList.removeIf(t->t.getUserID()==userId);
}
좀 더 적합한 방법을 찾아봐야겠다...
반응형
'Language > java' 카테고리의 다른 글
Stream의 foreach 와 for-loop 차이 (0) | 2021.06.24 |
---|---|
컬렉션(Collection) sorted() (0) | 2021.05.26 |
자바 컬렉션/Java Collection (List, Set, Queue, Map) (0) | 2021.05.25 |
[OCPJP]Java SE 8 Programmer II Certification Exam | 1Z0-809 덤프/DUMP 문제#81~93 (0) | 2021.03.01 |
[OCPJP]Java SE 8 Programmer II Certification Exam | 1Z0-809 덤프/DUMP 문제#61~80 (0) | 2021.03.01 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 캐시삭제
- C# java 차이점
- 백준퇴사
- 백준
- c#
- 프론트엔드
- C++
- 런타임에러
- 개발중캐시삭제
- html꿀팁
- 선언적트랜잭션 #noRollbackFor #@Transactional
- boj
- html
- script버전
- 퇴사
- 프론트엔드개발자
- 백준14501
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함