[Java] 람다식
JAVA의 정석
람다식
람다식이란?
람다식은 ‘익명 함수’로 불리는데, 메서드에서 이름과 반환타입을 제거하기 때문이다.
int[] arr = new int[5];
Arrays.setAll(arr, ***(i)->(int)(Math.random()*5)+1***); //람다식으로 표현
int method(){
return (int)(Math.random()*5)+1;
}
람다식 작성하기
익명 함수답게 반환타입 X 이름 X
Example. 두 값 중에서 큰 값을 반환하는 메서드 max를 람다식으로 변환
int max(int a, int b){
return a > b ? a : b;
}
(int a, int b) -> {
return a > b ? a : b;
}
- 반환 값이 있는 메서드의 경우, return문 대신 ‘식’으로 대신 할 수 있다. 식의 연산결과가 자동으로 반환값이 된다. ‘문장’이 아닌 ‘식’이므로 끝에 ‘;’을 붙이지 않는다.
(int a, int b) -> { return a > b ? a : b;} // return문
(int a, int b) -> a > b ? a : b // 식으로 표현
- 매개변수 타입 추론 가능한 경우 생략 가능. (대부분 생략가능)
(a, b) -> a > b ? a : b
- 매개변수 하나뿐일 경우 괄호 생략 가능
a -> a * a // OK
(int a) -> a * a // OK : 매개변수 타입 있으면 괄호 생략 X
- 괄호안의 문장이 하나일 경우 생략 가능. 문장 끝에 세미 콜론 X
함수형 인터페이스
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, new Comparator<String>(){
public int compare(String s1, String s2){
retrun s2.compareTo(s1);
}
});
이제 람다식으로 아래와 같이 간단히 처리 가능.
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
스트림(Stream)
스트림이란
문제점
- 많은 수의 데이터를 다를 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해서 코드 작성했음.
- 데이터 소스마다 다른 방식으로 다뤄야하는 것. ex) List 정렬 → Collections.sort(), Arrays.sort()
해결을 위한 방법이 Stream
데이터 소스 추상화, 자주 사용되는 메서드 정의
⇒ 데이터 소스가 무엇이던 간에 같은 방식
⇒ 코드 재사용성 증가
스트림을 이용하면 배열, 컬렉션, 파일에 저장된 데이터 모두 같은 방식
String[] strArr = {"aaa", "ddd", "ccc"};
List<String> strList = Arrays.asList(strArr);
//스트림 생성
Stream<String> strStream1 = strList.stream();
Stream<String> strStream2 = Arrays.stream(strArr);
//정렬하고 출력하는 방법 동일. 하지만 데이터 소스가 정렬되는 것은 아님.
strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);
Leave a comment