2018-6-27 Java8 람다

람다함수

interface Printable {
    void print(String s);
}

public class OneParamNoReturn {
    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");
    }
}

  • 메소드의 몸체가 하나의 문장이면 중괄호 생략 가능하다.
  • 중괄호를 생략하면 끝에 위치한 세미콜론도 생략해야한다.
  • 매개변수가 하나이면 매개변수 소괄호도 생략이 가능하다.

매개변수가 2개이고 리턴타입이 void

interface Calculate {
    void cal(int a, int b); // 매개변수 2개, 반환형 void
}

public 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); // 곱셈진행
    }
}

매개변수가 있고 리턴타입이 있는 람다식

interface Calculate2 {
    int cal(int a, int b);
}

public class TwoParamAndReturn {
    public static void main(String[] args) {
        Calculate2 c;
        c = (a, b) -> { return a + b; };
        System.out.println(c.cal(4, 3));

        c = (a, b) -> a + b;
        System.out.println(c.cal(4, 3));
    }
}
  • 몸체에 해당하는 부분이 return문이면 중괄호 생략이 불가능하다. 하지만 (a,b) -> a + b;는 가능하다.
package chapter27;

interface HowLong {
    int len(String s);
}
public class OneParamAndReturn {
    public static void main(String[] args) {
        HowLong h1 = s -> s.length();
        System.out.println(h1.len("I'm so happy"));
    }
}
//result
12

매개변수가 없는 람다식

interface Generator {
    int rand(); // 매개변수 없는 메소드
}
public class NoParamAndReturn {
    public static void main(String[] args) {
        Generator gen = () -> {
            Random rand = new Random();
            return rand.nextInt(50);
        };

        System.out.println(gen.rand());
    }
}
//result
16
  • 매개변수 선언이 없는 관계로 매개변수 정보를 담는 소괄호는 비어있다.
  • 둘 이상의 문장으로 이루어진 람다식에는 중괄호가 필요, 값을 반환할 때도 return문이 필요하다.

함수형 인터페이스와 어노테이션

  • 인터페이스에 추상 메소드가 딱 하나만 존재하는 인터페이스를 함수형 인터페이스라고 한다.
@FunctionalInterface
interface Calculate {
	int cal(int a, int b);
}
  • @FunctionalInterface는 함수형 인터페이스에 부합한지를 확인하기 위한 어노테이션이다.
  • 이러한 인터페이스에 둘 이상의 추상메소드가 존재하면, 컴파일에러가 발생한다.
  • 그러나 static, default선언이 붙은 메소드 정의가 있으면 아무런 영향을 미치지 않기때문에 함수형인터페이스로 분류가 된다.
@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 Calculate3 <T> { //제네릭기반 함수형 인터페이스
    T cal(T a, T b);
}

public class LambdaGeneric {
    public static void main(String[] args) {
        Calculate3<Integer> ci = (a, b) -> a + b;
        System.out.println(ci.cal(4, 3));

        Calculate3<Double> cd = (a, b) -> a + b;
        System.out.println(cd.cal(4.32, 3.45));
    }
}
//result
7
7.7700000000000005
  • 위의 두 메소드에서 참조변수의 자료형이 다른관계로 서로다른 인스턴스의 생성으로 이어진다.
Written on June 27, 2018