TIL

java 람다식에서는 종단변수를 사용해야함.

하얀잔디 2024. 6. 5. 15:57
String searchText = "";

if(searchText==null) searchText="";

eventNameList = Arrays.stream(EventNameEnum.values())
                        .filter(e -> e.getDescription().contains(searchText))
                        .map(Enum::name)
                        .collect(Collectors.toList());​
String searchText =""

eventNameList = Arrays.stream(EventNameEnum.values())
        .filter(e -> e.getDescription().contains(searchText))
        .map(Enum::name)
        .collect(Collectors.toList());

와 같은 코드에서는 문제가 없다. 하지만 윗부분을 살짞 바꿔서

searchText에 대한 null을 빈칸으로 바꾸면 에러가 나타난다.

 

String searchText = "";

if(searchText==null) searchText="";

eventNameList = Arrays.stream(EventNameEnum.values())
                        .filter(e -> e.getDescription().contains(searchText))
                        .map(Enum::name)
                        .collect(Collectors.toList());​

 

이유는 자바 람다식은 '종단변수' 를 사용해야한다.

 

종단변수란 변하지 않는 변수를 말한다. 이래야 하는 이유는

 

Java에서는 람다 표현식이나 익명 클래스에서 외부 변수를 참조할 때, 그 변수는 종단 변수이어야 합니다. 이는 람다 표현식이나 익명 클래스가 외부 변수의 변경을 안전하게 처리할 수 있도록 하기 위해서이다.

 

참고)

 

https://velog.io/@destiny1616/%EB%9E%8C%EB%8B%A4%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%99%B8%EB%B6%80-%EC%A7%80%EC%97%AD-%EB%B3%80%EC%88%98%EA%B0%80-final-%ED%98%B9%EC%9D%80-effectively-final%EC%9D%B4%EC%96%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

람다에서 사용하는 외부 지역 변수가 final 혹은 effectively final이어야 하는 이유

이전 아티클에서 익명클래스에 대해 소개하였다(참고: 익명클래스). 이러한 익명클래스와 관련된 한가지 문제는 익명클래스 구현이 매우 간단한 경우, 예를들어 하나의 메서드만 포함하는 인터

velog.io

 

'TIL' 카테고리의 다른 글

EC2 스프링 띄우기 명령어 모음집  (0) 2024.06.07
ec2 db 원격들어가서 바꾸기  (0) 2024.06.05
Oracle In절 순서대로 select하기  (1) 2024.05.30
http header  (1) 2024.05.28
Json + 이미지 같이받는법  (1) 2024.05.27