본문 바로가기

# 02/Java

[윤성우 열혈자바] 27-1. 람다와 함수형 인터페이스

반응형

인터페이스 중에서 추상형 메소드(구현해야할 메소드)가 딱 하나 존재하는 인터페이스 

함수형 인터페이스




인스턴스보다 기능 하나가 필요한 상황을 위한 람다


class SLenComp implements Comparator<String> {

@Override

public int compare (String s1, String s2) {

return s1.length() - s2.length()

}

}


class SLenComparator {

public static void main(String[] args) {

List<String> list = new ArrayList<>();

list.add("Robot");

list.add("Lambda");

list.add("Box");


Collections.sort(list, new SLenComp());        // 정렬


for(String s : list)

System.out.println(s);

}

}










매개변수가 있고 반환하지 않는 람다식


interface Printable {

void print(String s);            // 매개변수 하나, 반환형 패ㅑㅇ

}


class OnePraramNoReturn {

public static void main(String[] args) {

Printable p;

p = (String s) -> { System.out.println(s); };            // 줄임 없는 표현

p.print("Lambda exp one.");


p = (String s) -> System.out.println(s);                    // 중괄호 생략

p.print("Lambda exp two.");


p = (s) -> System.out.println(s);                        // 매개변수 형 생략

p.print("Lambda exp three.");


p = s -> System.out.println(s);                            // 매개변수 소괄호 생략

p.print("Lambda exp four.");

}

}


메소드 몸체가 둘 이상의 문장으로 이뤄져 있거나, 매개변수의 수가 둘 이상인 경우에는 각각 중괄호와 소괄호의 생략이 불가능하다.








매개변수가 둘 인 람다식 - 소괄호 생략 못함!!


interface Calculate {

void cal(int a, int b);            // 매개변수 둘, 반환형 void

}


class TwoParamNoReturn {

public static void main(String[] args) {

Calculate c;

c = (a, b) -> System.out.println(a + b);

c.cal(4, 3);        // 이번엔 덧셈이 진행


c = (a, b) -> System.out.println(a - b);

c.cal(4, 3);        // 이번엔 뺄셈이 진행


c = (a, b) -> System.out.println(a * b);

c.cal(4, 3);        // 이번엔 곱셈이 진행

}

}










매개변수가 있고 반환하는 람다식 1


interface Calculate {

int cal(int a, int b);        // 값을 반환하는 추상 메소드

}


class TwoParamAndReturn {

public static void main(String[] args) {

Calculate c;

c = (a, b) -> { return a+b; };            return문의 중괄호는 생략 불가!

System.out.println(c.cal(4, 3));


c = (a, b) -> a+b;                 연산 결과가 남으면, 별도로 명시하지 않아도 반환 대상이 됨!

System.out.println(c.cal(4, 3));

}

}










매개변수가 있고 반환하는 람다식 2


interface HowLong {

int len(String s);            // 값을 반환하는 메소드

}



class OneParamAndReturn {

public static void main(String[] args) {

HowLong hl = s -> s.length();

System.out.println(hl.len("I am so happy"));

}

}










매개변수가 없는 람다식


interface Generator {

int rand();                // 매개변수 없는 메소드

}


class NoParamAndReturn {

public static void main(String[] args) {

Generator gen = () -> {

Random rand = new Random();

return rand.nextInt(50);

};

System.out.println(gen.rand());

}

}










함수형 인터페이스(Functional Interfaces)와 어노테이션


함수형 인터페이스 : 추상 메소드가 딱 하나만 존재하는 인터페이스


@FunctionalInterface

함수형 인터페이스의 조건을 갖추었는지에 대한 검사를 컴파일러에게 요청!



@FunctionalInterface

interface Calculate {

int cal(int a, int b);

}


@FunctionalInterface

interface Calculate {

int cal(int a, int b);

default int add(int a, int b) { return a + b; }

static int sub(int a, int b) { return a - b; }

}



추상 메소드가 하나이니, 함수형 인터페이스 조건에 부합!








람다식과 제네릭


@FunctionalInterface

interface Calculate <T> {    // 제네릭 기반의 함수형 인터페이스

T cal(T a, T b);

}


class LambdaGeneric {

public static void main(String[] args) {

Calculate<Integer> ci = (a, b) -> a + b;

System.out.println(ci.cal(4, 3));


Calculate<Double> cd = (a, b) -> a + b;

System.out.println(cd.cal(4.32, 3.45));

}

}



인터페이스가 제네릭 기반이라 하여 특별히 신경 쓸 부분은 없다.

타입 인자가 전달이 되면(결정이 되면) 추상 메소드의 T는 결정이 되므로!



반응형