요약

NPE 를 피하기 위해 null 체크를 넣다보면 코드가 엄청 더러워진다.

이를 피하기 위해 Optional 과 Functional interface 를 잘 사용합시다.

Java 의 경우

Optional 만들려면 Optional.ofNullable() 를 사용하면 된다. 비어있는 박스만 만들려면 Optional.empty() 를 사용한다.

Endpoint operation 으론 .get(), .orElse() 가 있다. .get().isPresent() 같은 것과 같이 사용하고 보통 .orElse() 를 사용하는 편임.

Lambda 와 같이 사용하려면 .ifPresent(), orElseGet() 을 사용한다. orElseGet() 은 supplier 와 같이 사용한다. .map() 은 연속 null check 할 때 쓸수도 있다.

Javascript 의 경우

Null coalescense 가 매우 유용하다. (Java 엔 왜 없는지 모르겠음)

item?.map();
item?? "default"

Python 의 경우

이 방법이 국룰이다.

item = s if s in not None else "default"

or 'default' 를 사용하는 방법은 antipattern 으로 여겨지기도 해서, 안전하게 간다.

Javascript 는 Java 하고 lambda 사용법이 비슷해서 따로 공부안해도 되지만, (reduce 같은 건 좀 다르긴 하지만) Python 은 모양새가 꽤 다르다. Java 와 Python 의 lambda 를 비교해보자.

// Function, BiFunction
Item i -> i * 2;
Item i1, Item i2 -> i1 + "," + i2;

// Consumer
Item i -> System.out.println(i);

// Supplier
() -> new Item();

Python 은 생긴것만 다르다.

// 기본 모양
lambda x: x * 2

// 기본 사용
(lambda x: x * 2)(2)
> 4

// map
list(map(lambda x: x * 2, [1,2,3]))
> [2,4,6]

// reduce 는 모듈 불러와야 한다.
from functools import reduce
reduce(lambda (x,y): y + x, 'test')
> 'tset'

Java 는 인수가 왼쪽, 함수가 오른쪽이지만 Python 은 반대다. 덕분에 chaining 을 하면 오른쪽에서 왼쪽으로 읽어야 되는 별로 맘에 안드는 코드가 된다. 근데 사실 왼쪽에서 오른쪽으로 읽으면 함수 기준으로 읽게 되는데, 이것도 나름 괜찮을지도 모른다.

result = map(
    lambda x : x + 2,
    filter(
        lambda x : x % 2 == 0,
        [1, 2, 3, 4, 5]
    )
)
print(result)
> [4,6]

수학에서 f(g(x)) 처럼 쓰는거랑 비슷한 방식이다.