제육's 휘발성 코딩
Published 2021. 7. 28. 01:43
람다식 🔷 Java/Basic
반응형

람다식이란 (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() : 매개변수와 반환 자료형이 동일하게 처리된다.
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^