람다 표현식은 (매개변수) -> {실행문} 의 형태로 작성됩니다.
매개변수가 하나라면 괄호 () 를 생략할 수 있습니다.
실행문이 한 줄이라면 중괄호 {} 와 return 키워드를 생략할 수 있습니다.
메서드 참조를 사용하면 람다 표현식을 더 간단하게 작성할 수 있다.
ex) (x) -> System.out.print(x)는 => System.out::println으로 표현할 수 있다.
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class LamdaApp {
public static void main(String[] args) {
// Consumer<T> 함수형 인터페이스: 제네릭으로 전돨된 Java 자료형의 객체를 매개변수로 제공받아
// 아무것도 반환하지 않는 accept() 추상메소드가 선언된 함수형 인터페이스
// 아무것도 반환하지 않을때!
// 추상메소드가 하나짜리만 있는 인터페이스만 람다표현식 이용해야됨
int number = 100;
// Consumer 인터페이스를 상속받은 익명클래스를 사용해 객체를 생성하여 참조변수에 저장
/*
Consumer<Integer> integerConsumer = new Consumer<Integer>() {
// Cosumer인터페이스가 가지고 있는 메소드를 사용하려면 무조건 오버라이딩
@Override
public void accept(Integer i) {
System.out.println(number + i);
}
};
*/
// Consumer 함수형 인터페이스로 람다표현식을 사용해 객체를 생성하여 참조변수에 저장
Consumer<Integer> integerConsumer = i -> System.out.println(number + i);
integerConsumer.accept(200);
System.out.println("=================================================");
// Predicate<T> 함수형 인터페이스: 제네릭으로 전달된 Java 자료형의 객체를 매개변수로 제공받아
// 논리값(boolean)을 반환하는 test() 추상메소드가 작성된 함수형 인터페이스
// Predicate<Integer> isEven = new Predicate<Integer>() {
// @Override
// public boolean test(Integer i) {
// return i % 2 == 0;
// }
// };
Predicate<Integer> isEven = i -> i % 2 == 0;
if(isEven.test(200)) {
System.out.println( "입력값은 짝수입니다");
}else {
System.out.println( "입력값은 홀수입니다");
}
System.out.println("=================================================");
// Function<T, R> 함수형 인터페이스: 첫번째 제네릭으로 전달된 Java 자료형의 객체를 매개변수로 전달받아
// 처리하고 두번째 제네릭으로 전달된 Java 자료형의 객체를 반환하는 apply() 추상메소드가 작성된 함수형 인터페이스
// Function<String, Integer> stringLength = new Function<String, Integer>() {
// @Override
// public Integer apply(String str) { // 문자형으로 값을 받고
// // Integer로 반환
// return str.length();
// }
// };
Function<String, Integer> stringLength = str -> str.length();
System.out.println("문자 갯수 = " + stringLength.apply("Java Programming"));
}
}