JAVA

람다식,Lambda Expressions 개념및 예제

웹개발자준비 2018. 8. 9. 18:42

Lambda Expressions

- 병렬처리, 이벤트 처리, 스트림 처리 등.. 사용

- JDK1.8지원

- 함수형 프로그래밍 방식(<-> 객체 지향 프로그래밍)

- 형태는 매개변수를 가지는 코드블럭( =메소드)

- 인터페이스 + 익명 객체 + 람다식을 같이 사용한다.

- 생김새는 메소드를 선언하는 것과 유사 > (하지만)실제로는 이름없는 클래스와 이름없는 메소드를 만드는 코드

 -*****람다식을 사용하는 이유는 1회용 익명 메소드가 필요하기 때문 > 하지만 자바는 독립적인 메소드만을 생성하지 못하기 떄문에 익명 객체를 이용해서 만든다.


람다식 기본형태

- (자료형 매개변수) -> {실행코드;}

a. 매개변수 : 메소드 매개변수

b. -> : Arrow, 코드블럭을 실행(호출)

c. {} : 메소드 구현부


예시)

1. (int num) -> {System.out.println(num);}

2. (int num) -> System.out.println(num);

3. (num) -> System.out.println(num);

4. num -> System.out.println(num);

5. () -> System.out.println();

6. (x,y) -> System.out.println();

7. () -> {return value;}

8. () -> value;

9. (x,y) -> x+y;


람다식 실제사용

- 인터페이스 변수 = 람다식;

- 람다식과 인터페이스는 밀접한 관계(람다식 시그너처 == 인터페이스 추상 메소드의 시그너처)


람다식에서 사용되는 인터페이스

1. 반드시 추상 메소드가 유일해야 한다.(*********)

2. 람다식을 담는 인터페이스를 주로 '람다식 타겟타입(Target Type)' 이라고 한다.

3. 람다식을 담는 인터페이스를 주로 '함수적(형) 인터페이스, Funcional Inteface'이라고 한다.(*********)

4. 자바는 개발자에 사용하기 위한 함수적 인터페이스 여럿 제공합니다.


**

@functionalInterface -> 어노테이션붙이면 추상메소드가 2개이상 만들어졌을때 에러가 자동적으로 발생한다.

interface TestType{

void aaa();

}


---------------------------------------------------------------------------------------------------------------------

inteface MyInterface{ // 인터페이스

void test(); //추상메소드

}


//익명객체

MyInterface my1 = new MyInterface(){

@Override

public void test(){

System.out.println("테스트입니다");

}

};


my1.test();

---------------------------------------------------------------------------------------------------------------------

interface MyType{ //매개변수X, 반환값X

void hello();

}


//익명 메소드 -> 람다식을 사용해서 익명 메소드 생성

MyType my3 = () -> {System.out.println("안녕하세요.")};

my3.hello()


MyType my4 = () -> {

System.out,println("반갑습니다.");

System.out.println("안녕하세요");

System.out.println("잘부탁드립니다.");

};

my4.hello();

---------------------------------------------------------------------------------------------------------------------

//실행블럭에 문장이 1줄이면 {}생략 가능

MyType my5 = () -> System.out.println("안녕하세요");

my5.hello();

---------------------------------------------------------------------------------------------------------------------

//매개변수O, 반환값X

interface YourType{

void talk(String msg);

}


YourType your = (String msg) -> System.out.println(msg); //원본

YourType your = (msg) -> System.out.println(msg); //자료형 생략가능

YourType your = msg -> System.out.println(msg); //() 소괄호 생략 가능


**중요

매개변수가 없을때는 소괄호를 생략하면 안된다.

---------------------------------------------------------------------------------------------------------------------

//BMI = 몸무게/((키/100*키/100)) 

---------------------------------------------------------------------------------------------------------------------

class User{ //User 클래스

private String name;

private int age;

public User() {};

public User(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {


return String.format("%s(%s)", this.name,this.age);

}

}


//정렬

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

list.add(new User("홍길동",20));

list.add(new User("아무개",25));

list.add(new User("테스트",22));

list.add(new User("하하하",28));

list.add(new User("호호호",24));

System.out.println(list);

//1. Collections.sort(list);

//2. list.sort();

list.sort(new Comparator<User>() { //Custom Comparator

@Override

public int compare(User o1, User o2) {

//         return o1.getName().compareTo(o2.getName());

return o1.getAge()-o2.getAge(); //정렬기준

}

});

System.out.println(list);

list.sort((o1,o2) -> o2.getAge() - o1.getAge());

System.out.println(list);

TreeSet<User> set = new TreeSet<User>((o1,o2)->o1.getName().compareTo(o2.getName()));

set.add(new User("홍길동",20));

set.add(new User("아무개",25));

set.add(new User("테스트",22));

set.add(new User("하하하",28));

set.add(new User("호호호",24));

System.out.println(set);


***

public static double getBMI(int weight,int height) {

double bmi = (double)weight/((double)height/100 * (double)height/100);

return Math.round(bmi);

}

---------------------------------------------------------------------------------------------------------------------