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

원글 페이지 : 바로가기

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다