람다식,Lambda Expressions 개념및 예제
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);
}
---------------------------------------------------------------------------------------------------------------------