14.5.6 andThen()과 compose() 디폴트 메소드


- 함수적 인터페이스가 가지고 있는 디폴트 메소드이다.

- 두 개의 함수적 인터페이스를 순차적으로 연결해서 실행한다.

- 첫번째 리턴값을 두번째 매개값을 제공해서 최종 결과값을 리턴한다

- andThen()과 compose()의 차이점은 어떤 함수적 인터페이스부터 처리하느냐이다.


 - compose() 디폴트 메소드

- andThen() 디폴트 메소드



andThen()과 compose() 디폴트 메소드를 제공하는 함수적 인터페이스


- Consumer의 순차적 연결

// Consumer 종류의 함수적 인터페이스는 처리 결과를 리턴하지 않기 때문에 

andThen()과 compose() 디폴트 메소드는 함수적 인터페이스의 호출 순서만 정한다




 Member

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sec05.exam07_andthen_compose;
 
public class Member {
    private String name;
    private String id;
    private Address address;
    
    public Member(String name, String id, Address address) {
        this.name = name;
        this.id = id;
        this.address = address;
    }
 
    public String getName() { return name; }
    public String getId() { return id; }
    public Address getAddress() { return address; }
}
cs

 Address

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec05.exam07_andthen_compose;
 
public class Address {
    private String country;
    private String city;
    
    public Address(String country, String city) {
        this.country = country;
        this.city = city;
    }
    
    public String getCountry() { return country; }
    public String getCity() { return city; }
}
cs


 Consumer의 순차적 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package sec05.exam07_andthen_compose;
 
import java.util.function.Consumer;
 
public class ConsumerAndThenExample {
    public static void main(String[] args) {
        Consumer<Member> consumerA = (m) -> { 
            System.out.println("consumerA: " + m.getName()); 
        };
        
        Consumer<Member> consumerB = (m) -> { 
            System.out.println("consumerB: " + m.getId()); 
        };
        // 연결
        Consumer<Member> consumerAB = consumerA.andThen(consumerB);
        consumerAB.accept(new Member("홍길동""hong"null));
    }
}
cs

 




- Function 순차적 연결

// Function과 Operator 종류의 함수적 인터페이스는 먼저 실행한 함수적 인터페이스의 결과를

다음 함수적 인터페이스의 매개값으로 넘겨주고, 최종 처리결과를 리턴한다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package sec05.exam07_andthen_compose;
 
import java.util.function.Function;
 
public class FunctionAndThenComposeExample {
    public static void main(String[] args) {
        Function<Member, Address> functionA;
        Function<Address, String> functionB;
        Function<Member, String> functionAB;
        String city;
        
        functionA = (m) -> m.getAddress(); // 주소리턴
        functionB = (a) -> a.getCity(); // 문자열리턴
        
        functionAB = functionA.andThen(functionB);
        city = functionAB.apply(
            new Member("홍길동""hong"new Address("한국""서울"))
        );
        System.out.println("거주 도시: " + city); // 서울
        
        functionAB = functionB.compose(functionA);
        city = functionAB.apply(
            new Member("홍길동""hong"new Address("한국""서울"))
        );
        System.out.println("거주 도시: " + city); // 서울
    }
}
cs

14.5.7 and(), or(), negate() 디폴트 메소드와 isEqual() 정적 메소드
- and(), or(), negate() 디폴트 메소드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package sec05.exam08_and_or_negate_isequal;
 
import java.util.function.IntPredicate;
 
public class PredicateAndOrNegateExample {
    public static void main(String[] args) {
        //2의 배수 검사
        IntPredicate predicateA = a -> a%2 == 0;
        
        //3의 배수 검사
        IntPredicate predicateB = (a) -> a%3 == 0;
        
        IntPredicate predicateAB;
        boolean result;
        
        //and()
        predicateAB = predicateA.and(predicateB);
        result = predicateAB.test(9); // false
        System.out.println("9는 2와 3의 배수입니까? " + result);
        
        //or()
        predicateAB = predicateA.or(predicateB);
        result = predicateAB.test(9); // true
        System.out.println("9는 2 또는 3의 배수입니까? " + result);
        
        //negate()
        predicateAB = predicateA.negate();
        result = predicateAB.test(9); // true
        System.out.println("9는 홀수입니까? " + result);
    }
}
cs

- isEqual() 정적 메소드

  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package sec05.exam08_and_or_negate_isequal;
 
import java.util.function.Predicate;
 
public class PredicateIsEqualExample {
    public static void main(String[] args) {
        Predicate<String> predicate;
        
        predicate = Predicate.isEqual(null);
        System.out.println("null, null: " + predicate.test(null)); // true
        
        predicate = Predicate.isEqual("Java8");
        System.out.println("null, Java8: " + predicate.test(null)); // false
        
        predicate = Predicate.isEqual(null);
        System.out.println("Java8, null: " + predicate.test("Java8")); // false
        
        predicate = Predicate.isEqual("Java8");
        System.out.println("Java8, Java8: " + predicate.test("Java8")); // true
        
        predicate = Predicate.isEqual("Java8");
        System.out.println("Java7, Java8: " + predicate.test("Java7")); // false
    }
}
cs


14.5.8. minBy(), maxBy() 정적 메소드


1
2
3
4
5
6
7
8
9
10
11
package sec05.exam09_minby_maxby;
 
public class Fruit {
    public String name;
    public int price;
    
    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package sec05.exam09_minby_maxby;
 
import java.util.function.BinaryOperator;
 
public class OperatorMinByMaxByExample {
    public static void main(String[] args) {
        BinaryOperator<Fruit> binaryOperator;
        Fruit fruit;
        
        binaryOperator = BinaryOperator.minBy((f1,f2)->Integer.compare(f1.price, f2.price));
        fruit = binaryOperator.apply(new Fruit("딸기"6000), new Fruit("수박"10000));
        System.out.println(fruit.name); // 딸기
        
        binaryOperator = BinaryOperator.maxBy((f1,f2)->Integer.compare(f1.price, f2.price));
        fruit = binaryOperator.apply(new Fruit("딸기"6000), new Fruit("수박"10000));
        System.out.println(fruit.name); // 수박
    }
}
cs



















Posted by 너래쟁이
: