람다식(Lambda expression) 메서드를 하나의 식으로 표현한 것이다.
그러나 메서드를 람다식으로 표현하면 메서드 이름과 반환값이 없어지므로, 람다식을 익명 함수 라고도한다.
int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
아래내용을 위로 바꾼것이 람다식이다.
int method(int i){
return (int)(Math.random()*5)+1;
}
람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진것이다.
메서드를 람다식으로 작성하는 과정이다.
1.
int max(int a, int b){
return a>b ? a : b;
}
int max(int a, int b) - >{
return a>b? a:b;
}
반환 값이 있는 메서드의 경우 return문 대신에 식(expression)으로 대신할수있다. 식의 연산 결과가 자동적으로 반환된다 이때는 문장(statement)이 아닌 식이므로 끝에 ';'(콜론)을 붙이지 않는다.
(int a, int b) -> {return a>b? a: b;} -----> (int a, int b) -> a>b ? a:b
완성
(int a, int b) -> a>b? a:b ----------> (a, b) -> a> b? a:b
매개 변수가 하나 뿐이라면 괄호를 생각할수있다. 단 매개변수의 타입이 있으면 (int a) 괄호()를 생략할수없다.
(a) -> a*a ------------> a -> a*a
함수형 인터페이스 | 메서드 | 설 명 |
---|---|---|
java.lang.Runnalbe | void run() | 매개변수도 없고, 반환값도 없음. |
Supplier | T get() | 매개 변수는 없고, 반환값만 있음 |
Consumer | void accept(T t) | supplier와 반대로 매개변수가 밌고 반환값이 없음 |
Function<T,R> | R aplly(T t) | 일반적인 함수 하나의 매개변수를 받아서 결과를 반환 |
Predicate | boolean test(T t) | 조건식을 표현하는데 사용됨. 매개변수는 하나 반환 타입은 boolean |
함수형 인터페이스 | 메서드 | 설 명 |
---|---|---|
BiConsumer<T, U> | void accept(T t, U u) | 두개의 매개변수만 있고 반환값이 없다. |
BiPredicate<T,U> | boolean test(T t, U u) | 조건식을 표현하는데 사용되며 매개변수는 둘 반환값은 boolean |
BiFunction<T,U,R> | R aplly(T t, U u) | 두개의 매개변수를 받아서 하나의 결과를 반환 |
함수형 인터페이스 | 메서드 | 설 명 |
---|---|---|
UnaryOpertator | T apply(T t) | Function의 자손, Function과 달리 매개변수와 결과의 타입이 같다. |
BinaryOperator | T test(T t, T t) | BiFunction의 자손, BiFuntion과 달리 매개변수와 결과의 타입이 같다. |
Integer wapper(String s){
return Integet,parseInt(s);
}
위 메서드를 아래와 같이 바꿀수 있다.
Fucntion<String, Integer> f = (string s) -> Integer.parseInt(s);
↓ ↓ ↓ ↓
Fucntion<String, Integer> f = Integer::parseInt;//메서드 참조
클래스이름::메서드이름 또는 참조변수::메서드 이름으로 바꿀수있다.
String[] strArr = {"aaa", "bbb", "ccc"};
List strList = Arrays.asList(strArr);
Stream strStream1 = strList.stream(); // 스트림생성
Stream strStream2 = Arrays.stream(strArr); // 스트림생성
strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);