•
Lambda Example 1
◦
인터페이스
package com.lambda;
@FunctionalInterface
public interface MyInterface {
void action(int x);
}
Java
복사
◦
code 1
package com.lambda;
public class LambdaExample {
public static void main(String[] args) {
MyInterface mi = new MyInterface() {
@Override
public void action(int x) {
System.out.println("숫자 " + x + "을 활용한 동작");
}
};
mi.action(3); // 같은 동작
MyInterface li = (x) -> System.out.println("숫자 " + x + "을 활용한 동작");
li.action(3); // 같은 동작
}
}
Java
복사
◦
code 2
package com.lambda;
public class LambdaExample2 {
public static void main(String[] args) {
action((x) -> System.out.println("숫자 " + x + "을 활용한 동작"));
}
public static void action(MyInterface mi) {
int x = 3;
mi.action(3);
}
}
Java
복사
•
Lambda Example 2
◦
인터페이스
package com.lambda2;
@FunctionalInterface
public interface Calculable {
int calculate(int x, int y);
}
Java
복사
◦
Calculator.java
package com.lambda2;
import java.util.Scanner;
public class Calculator {
public void calculate(Calculable calc) {
Scanner sc = new Scanner(System.in);
System.out.print("숫자를 입력하세요 -> ");
int x = sc.nextInt();
System.out.print("\n숫자를 입력하세요 -> ");
int y = sc.nextInt();
int result = calc.calculate(x, y);
System.out.println(result);
}
}
Java
복사
◦
CalculatorExample.java - 더하기, 빼기, 곱하기 연산을 람다식으로 표현
package com.lambda2;
public class CalculatorExample {
public static void main(String[] args) {
Calculator c = new Calculator();
c.calculate((x, y) -> x + y);
c.calculate((x, y) -> x - y);
c.calculate((x, y) -> x * y);
}
}
Java
복사
•
Lambda Example 3
◦
Speakable.java
package com.lambda3;
public interface Speakable {
void speak(String content);
}
Java
복사
◦
Workable.java
package com.lambda3;
public interface Workable {
void work(String name, String job);
}
Java
복사
◦
Person.java
package com.lambda3;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Person {
private String name, job, nation;
public void action1(Workable workable) {
workable.work(name, job);
}
public void action2(Speakable speakable) {
speakable.speak(nation);
}
}
Java
복사
◦
PersonExample
package com.lambda3;
public class PersonExample {
public static void main(String[] args) {
Person minsung = new Person("김민성", "프로그래머", "대한민국");
// 같은 Person임에도 다른 액션을 취하도록 만들 수 있다.
minsung.action1(((name, job) -> {
System.out.println("안녕하세요, 제 이름은 " + name + "입니다.");
System.out.println("제 직업은 " + job + "입니다.");
}));
minsung.action2(content -> {
if (minsung.getNation().equals("대한민국")) {
System.out.println("안녕하세요!");
} else {
System.out.println("Hello World!");
}
});
minsung.action2(System.out::println); // 대한민국 출력
}
}
Java
복사
•
Lambda Example 4
◦
AgeComparator
package com.lambda4;
import java.util.Comparator;
public class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
Java
복사
◦
Person.java
package com.lambda4;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
@AllArgsConstructor
@Getter
@ToString
public class Person {
private String name;
private int age;
// @Override
// public int compareTo(Person o) {
//// return Integer.valueOf(age).compareTo(o.getAge()); // 첫번째 방법
// if (age < o.getAge()) {
// return -1;
// } else if (age == o.getAge()) {
// return 0;
// } else {
// return 1;
// }
// }
}
Java
복사
◦
PersonExample
package com.lambda4;
import java.util.Comparator;
import java.util.TreeSet;
public class PersonExample {
public static void main(String[] args) {
// '권지훈', '김태환', '성제현'
// TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator<Person>() {
// @Override
// public int compare(Person o1, Person o2) {
// return o1.getAge() - o2.getAge();
// }
// });
// TreeSet<Person> treeSet = new TreeSet<Person>((o1, o2) -> o2.getAge() - o1.getAge());
// 메소드 참조 활용 - 위의 동작과 같음
TreeSet<Person> treeSet = new TreeSet<Person>(
Comparator.comparingInt(Person::getAge)
);
// TreeSet<Person> treeSet = new TreeSet<Person>(
// Comparator.comparingInt(Person::getAge)
// .thenComparing((o1, o2) -> o1.getName().compareTo(o2.getName()))
// );
treeSet.add(new Person("권지훈", 7));
treeSet.add(new Person("김태환", 8));
treeSet.add(new Person("성제현", 6));
System.out.println(treeSet);
}
}
Java
복사
•
Lambda Example 5
◦
Calculable.java
package com.lambda5;
@FunctionalInterface
public interface Calculable {
double calc(double x, double y);
}
Java
복사
◦
Person.java
package com.lambda5;
public class Person {
public void action(Calculable c) {
double result = c.calc(10, 4);
System.out.println("결과 : " + result);
}
}
Java
복사
◦
CalculateService.java
package com.lambda5;
// 서비스 로직만 따로 구현
public class CalculateService {
public static double sum(double x, double y) {
return x + y;
}
public static double multiply(double x, double y) {
return x * y;
}
}
Java
복사
◦
MethodReferenceExample
package com.lambda5;
public class MethodReferenceExample {
public static void main(String[] args) {
Person p = new Person();
// p.action(인터페이스); -> 인터페이스의 메소드 calc(10, 4) 호출 -> 그 결과 출력
// 추상 메소드 [double calc(double x, double y)]
p.action((x, y) -> CalculateService.sum(x, y));
p.action(CalculateService::sum); // 위 코드와 동작 같음
p.action((x, y) -> CalculateService.multiply(x, y));
p.action(CalculateService::multiply); // 위 코드와 동작 같음
}
}
Java
복사