Functional Interface
-추상(abstract) 메서드를 1개만 갖고 있는 인터페이스
-메서드의 인자로 메서드를 전달하는 것이 목적
@FunctionalInterface
public interface Greeting{
void greet();//public abstract는 생략가능
}
public class GreetingEx {
//Functional interface Greeting의 greet() 메서드를 수행
public void sayHello(Greeting greeting) {
greeting.greet();
}
public void go() {
//1.Greeting을 구현한 영어 인사 로컬 클래스
class EnglishGreeting implements Greeting {
@Override
public void greet() {
System.out.println("Hello.");
}
}
Greeting englishGreeting = new EnglishGreeting();
sayHello(englishGreeting);
//2.프랑스어 인사는 anonymous class(익명 클래스) 사용
Greeting frenchGreeting = new Greeting() {
@Override
public void greet() {
System.out.println("Bonjour.");
}
};
sayHello(frenchGreeting);
//3.스패인어 인사는 annonynous 클래스를 메서드에 직접 삽입.
sayHello(new Greeting() {
@Override
public void greet() {
System.out.println("Hola.");
}
});
//4,한국어 인사는 lambda expression 사용
//lambda expression은 functional interface 구현체의 메서드 내부만 표현한 것.
sayHello(() ->
System.out.println("안녕하세요."));
}
public static void main(String[] args) {
new GreetingEx().go();
}
}
Person.class```
public class Person {
String name;
int birthyear;
String email;
public Person(String name, int birthyear, String email) {
this.name = name;
this.birthyear = birthyear;
this.email = email;
}
public String getName() {
return name;
}
public int getBirthyear() {
return birthyear;
}
public String getEmail() {
return email;
}
@Override
public String toString() {
return "Person{" + "name=" + name + '\'' + ", birthyear=" + birthyear + ", email=" + email + '\'' + '}';
}
}
CheckPerson.interface
public interface CheckPerson {
boolean test(Person p);
}
PersonEx.class
public class PersonEx {
public void printPersons(List roster, CheckPerson checkPerson) {
for (Person person : roster) {
if (checkPerson.test(person)) {
System.out.println(person.toString());
}
}
}
public void go() {
Person p1 = new Person("아이유", 1993, "iu@gmail.com");
Person p2 = new Person("이선균", 1975, "sum@naver.com");
Person p3 = new Person("이지아", 1978, "lee@gmail.com");
List<Person> roster = new ArrayList<>();
roster.add(p1);
roster.add(p2);
roster.add(p3);
//성이 "이" 출력(annonymous 클래스)
System.out.println("성이 이씨");
printPersons(roster, new CheckPerson() {
@Override
public boolean test(Person p) {
return p.getName().startsWith("이");
}
});
//1990년 이후 출생자 출력(lambda expression)
System.out.println("1990년 이후 출생자");
printPersons(roster, (Person p) -> {
return p.getBirthyear() >= 1990;
});
//g메일 사용자 출력
System.out.println("g메일 사용자");
printPersons(roster, p -> p.getEmail().endsWith("gmail.com"));
}
public static void main(String[] args) {
new PersonEx().go();
}
}