자바를 공부하다가 신기한 문법을 발견했다. 화살표를 사용하는 문법,,, C++ 이후로는 코드에서 화살표를 본 것이 처음이었기에 찾아보니 자바 8부터 도입된 람다식이라고 한다. 오늘은 람다식에 대해서 알아보도록 하자.
이름이 없는 메소드, 익명 함수
(매개변수1, 매개변수2, ...) -> {실행문}
코드를 간결하게 만들고 가독성이 높아진다! 밑에는 내가 사용했던 예시이다.
item -> {
Assert.notNull(item, "GrantedAuthority에는 null이 들어가면 안 됩니다.");
return new SimpleGrantedAuthority(ROLE_PREFIX + item.get("authority"));
}
메소드 참조는 람다식에서 단 하나의 메소드를 호출할 경우 사용 가능!
더더더 간결하게!
같은 원리로 생성자도 참조 가능하다.
(a, b) -> a.a 메소드(b)
a 클래스::a 메소드
// 메소드 참조
(String s) -> Integer.parseInt(s); // 람다
Integer::parseInt; // 메소드 참조
// 생성자 참조
() -> new TreeMap<K, V>(); // 람다
TreeMap<K, V>::new; // 생성자 참조
람다를 활용할 수 있는 기술! 자료의 흐름이란 뜻을 가지며 배열과 컬렉션을 함수형으로 처리할 수 있다.
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Stream<Integer> stream = list.stream(); // 스트림 생성
stream.forEach(System.out::println); // 메소드 참조, 스트림 이용해서 순차 출력
// 한 줄로 표현 가능
list.stream().forEach(System.out::println);
findFirst()
: 첫번째 요소 리턴findAny()
: 필터를 적용해서 조건에 맞는 요소 리턴map()
: 변환아래는 내가 사용했던 예시이다.
String expectAuthority = newbieUser.getAuthorities()
.stream()
.findFirst()
.map(GrantedAuthority::getAuthority)
.map(auth -> "ROLE_" + auth)
.orElse(null);
newbieUser 의 getAuthorities 를 이용해서 가져온 stream의 첫번째 요소를 map을 이용해서 GrantedAuthority의 getAuthority로 변환 후 ROLE_를 붙여준다.