반응형
람다식이란 (Lambda expression)
- 메서드를 하나의 식으로 표현한 것
- 메서드 이름과 반환값이 없어서 익명함수라고도 한다.
- Java8부터 사용가능
- (매개변수..) -> { 실행문 };
람다식 예시
public class Ex1 {
public static void main(String[] args) {
Sample01 f = (n) -> System.out.printf("%s", n); //():매개변수가 없을 때
f.test("테스트");
Sample01 f2 = new Sample01() {
@Override
public void test(String n) {
System.out.printf("%s", n);
}
};
f2.test("테스트");
}
}
@FunctionalInterface //단 한개의 추상 메서드를 갖는 인터페이스
interface Sample01 {
public abstract void test(String name);
}
- f와 f2는 동일
- f는 람다식 사용, f2는 익명 내부클래스
- 익명 내부클래스는 내부 클래스 수만큼 class 파일이 생성 되지만 람다식은 생기지 않는다.
※ Sample01과 같이 람다식을 사용할 때마다 함수형 인터페이스를 만들어야하므로 API가 제공되고 있다.
인터페이스명 | 반환 자료형 | 메서드 | 매개변수 |
---|---|---|---|
Runnable | void | run() | 없음 |
Supplier | T | get() | 없음 |
Consumer | void | accept(T t) | 1개 |
Function<T,R> | R | apply(T t) | 1개 |
Predicate | boolean | test(T t) | 1개 |
UnaryOperator | T | apply(T t) | 1개 |
BiConsumer<T,U> | void | accept(T t, U u) | 2개 |
BiFunction<T,U,R> | R | apply(T t, U u) | 2개 |
BiPredicate<T,U> | boolean | test(T t, U u) | 2개 |
BinaryOperator | T | apply(T t, U u) | 2개 |
매개변수가 없는 함수형 인터페이스
public class Ex2 {
public static void main(String[] args) {
Runnable r = () -> System.out.println("매개변수 x 반환 x");
r.run();
Supplier<String> s = () -> "매개변수 x, 반환o";
System.out.println(s.get());
}
}
- Supplier 는 반환자료형(return 생략가능)을 제네릭을 이용하여 정의한다.
매개변수가 1개인 함수형 인터페이스
public class Ex3 {
public static void main(String[] args) {
List<Employee> emp = Arrays.asList(
new Employee(1,"a",1000),
new Employee(2,"b",1200),
new Employee(3,"c",1500),
new Employee(4,"d",1100)
);
Consumer<Employee> consumer = x -> {
//salary 2배
x.setSalary(x.getSalary() * 2);
};
doubleSalary(emp, consumer.andThen((item) -> System.out.println(item)));
}
private static void doubleSalary(List<Employee> emp, Consumer<Employee> f) {
for(Employee e: emp) {
f.accept(e);
}
}
}
@Data
@AllArgsConstructor
class Employee {
private int no;
private String name;
private double salary;
}
- Consumer 는 andThen()이라는 default 메서드를 추가 제공하며, 이 안에 들어오는 인자를 다음 작업으로 수행하게 된다. (가격을 2배올리는 작업 후에 출력하도록 )
- ArrayList 에선 Consumer를 forEach문을 통해 제공하고 있다.
반환 자료형 | 메서드 | 메서드 |
---|---|---|
void | forEach(Consumer<? Super E> action) | Iterable 모든 요소가 처리, 지정된 작업을 수행 |
List<Employee1> emp = Arrays.asList(
new Employee1(1,"a",1000),
new Employee1(2,"b",1200),
new Employee1(3,"c",1500),
new Employee1(4,"d",1100)
);
emp.forEach((x) -> {
x.setSalary(x.getSalary() * 2);
System.out.println(x);
});
public class Ex5 {
public static void main(String[] args) {
Function<String, Integer> work = s -> {
System.out.println("문자열 숫자 변환");
return Integer.parseInt(s);
};
Function<Integer, String> after = i -> {
System.out.println("숫자 문자열 변환");
return ""+i;
};
if(work.andThen(after).apply("123") instanceof String) {
System.out.println("문자열 o");
}
else System.out.println("문자열 x");
}
}
- Function <T, R> : T : 매개변수 , R :반환 자료형
- andThen 메서드로 두함수를 조립한 후에 work에 "123"을 넣어 123으로 변경된 값을 다시 after에 123을 넣어 "123"을 출력 후 String과 비교
- Fucntion.identity() : 매개변수와 반환 자료형이 동일하게 처리된다.
반응형