본문 바로가기

TIL

2022/02/07 TIL

The Red : STREAM

Predicate

  • 하나의 값을 입력받아 참과 거짓을 판단한다.
  • 3개의 default 메소드와 2개의 static 메소드가 존재한다. (default 메소드 까지만 학습한다)
  • [공식문서]
@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
}

test 예제

@Test
    void test_predicate(){
        Predicate<Integer> isPositive = x -> x > 0;
        assertThat(isPositive.test(10)).isTrue();
    }

negate 예제

    @Test
    void test_predicate_negate(){
        Predicate<Integer> isPositive = x -> x > 0;
        assertThat(isPositive.negate().test(10)).isFalse();
    }

or 예제

    @Test
    void test_predicate_or(){
        Predicate<Integer> isPositive = x -> x > 0;
        assertThat(isPositive.or( x -> x == 0 ).test(10)).isTrue();
        assertThat(isPositive.or( x -> x == 0 ).test(0)).isTrue();
        assertThat(isPositive.or( x -> x == 0 ).test(-1)).isFalse();
    }

and 예제

    @Test
    void test_predicate_and(){
        Predicate<Integer> isPositive = x -> x > 0;
        assertThat(isPositive.and( x -> x == 0 ).test(10)).isFalse();
        assertThat(isPositive.and( x -> x == 0 ).test(0)).isFalse();
        assertThat(isPositive.and( x -> x == 0 ).test(-1)).isFalse();
    }

Comparator

  • 두 객체의 값을 비교할 떄 사용합니다.
  • compare 메소드를 구현하여 사용하면 되지만, 주로 익명 함수로 사용합니다.
  • 공식문서

예제

class User{
    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

public class ComparatorTest {
    List<User> users = Arrays.asList(
            new User(5, "james"),
            new User(2, "sonny"),
            new User(3, "anny"));

    @Test
    void test_Comparator_id_asc(){
        Comparator<User> idComparator = (u1, u2) -> u1.getId() - u2.getId();
        Collections.sort(users, idComparator);
        assertThat(users.get(0).getId()).isEqualTo(2);
    }

    @Test
    void test_Comparator_id_desc(){
        Comparator<User> idComparator = (u1, u2) -> u2.getId() - u1.getId();
        Collections.sort(users, idComparator);
        assertThat(users.get(0).getId()).isEqualTo(5);
    }

    @Test
    void test_Comparator_name_asc(){
        Comparator<User> nameComparator = (u1, u2) -> u1.getName().compareTo(u2.getName());
        Collections.sort(users, nameComparator);
        assertThat(users.get(0).getName()).isEqualTo("anny");
    }
}

'TIL' 카테고리의 다른 글

2022/02/09 TIL  (0) 2022.02.10
2022/02/08 TIL  (0) 2022.02.08
2022/02/06 TIL  (0) 2022.02.07
2022/02/05 TIL  (0) 2022.02.05
2022/02/04 TIL (JAVA8)  (0) 2022.02.05