Posts RxJava - 함수형 메서드 레퍼런스
Post
Cancel

RxJava - 함수형 메서드 레퍼런스

메서드 레퍼런스란?

  • 우리말로 번역하면 메서드 참조라는 의미이다.
  • 람다 표현식 body(몸체) 부분에 기술되는 메서드를 이용해서 표현되며, 메서드의 이름만 전달한다.
  • 구분자(::)를 붙이는 방식으로 메서드 레퍼런스를 표현한다.
  • 메서드 레퍼런스를 사용하면 람다 표현식이 더욱 간결해진다.
  • 메서드 레퍼런스의 표현 예
    • (Car car) -> car.getCarName() = Car::getCarName

메서드 레퍼런스의 유형

ClassName::static method

  • (String s) -> Integer.parseInt(s)
  • Integer::parseInt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.function.Function;

/**
 * Class Name::static method 메서드 레퍼런스 예
 */
public class ClassNameStaticMethodExample {
    public static void main(String[] args) {
        // 람다 표현식 메서드 레퍼런스로 축약 전
        Function<String, Integer> f1 = (String s) -> Integer.parseInt(s);
        Integer result1 = f1.apply("3");
        System.out.println(result1);

        // 람다 표현식 메서드 레퍼런스로 축약 전
        Function<String, Integer> f2 = s -> Integer.parseInt(s);
        Integer result2 = f2.apply("3");
        System.out.println(result2);

        // 람다 표현식을 메서드 레퍼런스로 축약
        Function<String, Integer> f3 = Integer::parseInt;
        Integer result3 = f3.apply("3");
        System.out.println(result3);

    }
}

ClassName::instance method

  • (String s) -> s.toLowerCase()
  • String::toLowerCase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.itvillage.common.Car;

import java.util.function.Function;

public class ClassNameInstanceMethodExample {
    public static void main(String[] args) {
        Function<Car, String> f1 = car -> car.getCarName();
        String carName1 = f1.apply(new Car("트래버스"));
        System.out.println(carName1);

        Function<Car, String> f2 = Car::getCarName;
        String carName2 = f2.apply(new Car("팰리세이드"));
        System.out.println(carName2);
    }
}
/*
트래버스
팰리세이드
*/

object::instance method

  • (int count) -> obj.getTotal(count)
  • obj::getTotal
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
32
/**
 * Object::instance method 예
 */
public class ObjectInstanceMethodExample {
    public static void main(String[] args) {
        final CarInventory carInventory = new CarInventory(10);

        Function<Integer, Integer> f1 = count -> carInventory.getExpectedTotalCount(count);
        int totalCount1 = f1.apply(10);
        System.out.println(totalCount1);

        Function<Integer, Integer> f2 = carInventory::getExpectedTotalCount;
        int totalCount2 = f2.apply(20);
        System.out.println(totalCount2);

        // T -> T
        UnaryOperator<Integer> f3 = carInventory::getExpectedTotalCount;
        int totalCount3 = f3.apply(30);
        System.out.println(totalCount3);

        // Integer -> Integer
        IntUnaryOperator f4 = carInventory::getExpectedTotalCount;
        int totalCount4 = f4.applyAsInt(40);
        System.out.println(totalCount4);
    }
}
/*
20
30
40
50
*/

ClassName::new

  • ( ) -> new Car()
  • Car::new
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * Constructor::new 예
 */
public class ConstructorReferenceExample {
    public static void main(String[] args) {
        Function<String, Car> f1 = s -> new Car(s);
        Car car1 = f1.apply("콜로라도");
        System.out.println(car1.getCarName());

        Function<String, Car> f2 = Car::new;
        Car car2 = f2.apply("카니발");
        System.out.println(car2.getCarName());
    }
}
/*
콜로라도
카니발
*/

예제 코드

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
32
public class QuizAnswerForChapter0402 {
    public static void main(String[] args) {
        Predicate<String> p = s -> s.isEmpty();
        Predicate<String> p1 = String::isEmpty;
        System.out.println("문제 1번 결과: " + p1.test("Not Empty"));

        Function<Integer, String> f = i -> String.valueOf(i);
        Function<Integer, String> f1 = String::valueOf;
        System.out.println("문제 2번 결과: " + f1.apply(3));


        BiPredicate<List<Integer>, Integer> q = (list, num) -> list.contains(num);
        BiPredicate<List<Integer>, Integer> q1 = List::contains;
        System.out.println("문제 3번 결과: " + q1.test(Arrays.asList(1, 3, 5, 7, 9), 9));

        Consumer<String> c = s -> System.out.println(s);
        Consumer<String> c1 = System.out::println;
        c1.accept("문제 4번 결과: Hello!");

        BiFunction<String, CarType, Car> t = (s1, s2) -> new Car(s1, s2);
        BiFunction<String, CarType, Car> t1 = Car::new;
        Car car = t1.apply("말리부", CarType.SEDAN);
        System.out.println("문제 5번 결과: " + car.getCarName() + " / " + car.getCarType());
    }
}
/*
문제 1번 결과: false
문제 2번 결과: 3
문제 3번 결과: true
문제 4번 결과: Hello!
문제 5번 결과: 말리부 / SEDAN
*/

이 글은 inflearn에 있는 Kevin의 알기 쉬운 RxJava 1부를 공부하고 작성한 글입니다.
강의영상 링크

This post is licensed under CC BY 4.0 by the author.

RxJava - 함수형 인터페이스와 람다

RxJava - 연산자 개요 및 생성 연산자

Comments powered by Disqus.