함수형 프로그래밍에서는 함수를 일급 시민으로 취급한다. Java 8 에서도 이러한 기능이 추가되었으며, 그걸 함수형 인터페이스 라고 한다.
//익명 구현 객체로 전달
Collections.sort(cryptoCurrencies, new Comparator<CryptoCurrency>() {
@Override
public int compare(CryptoCurrency cc1, CryptoCurrency cc2) {
return cc1.getUnit().name().compareTo(cc2.getUnit().name());
}
});
//람다
Collections.sort(cryptoCurrencies, (cc1, cc2) -> cc1.getUnit().name().compareTo(cc2.getUnit().name()));
여기서 람다 표현식으로 작성해 파라미터로 전달한다는 것은 메서드 자체를 파라미터로 전달하는 것이 아니라, 함수형 인터페이스를 구현한 클래스의 인스턴스를 람다 표현식으로 작성해서 전달하는 것이다.
위와 같이 좀 더 축약할 수 있다. 이처럼 메서드 레퍼런스로 표현할 수 있는 유형은 네 가지가 있다.
cryptoCurrencies.stream()
.map(cc -> cc.getName())
// .map(name -> StringUtils.upperCase(name))
.map(StringUtils::upperCase)
.forEach(name -> System.out.println(name));
cryptoCurrencies.stream()
.map(cc -> cc.getName())
// .map(name -> name.toUpperCase())
.map(String::toUpperCase)
.forEach(name -> System.out.println(name));
PaymentCalculator calculator = new PaymentCalculator();
cryptoCurrencies.stream()
.filter(cc -> cc.getUnit() == CurrencyUnit.BTC)
.map(cc -> new ImmutablePair(cc.getPrice(), amount))
// .map(pair -> calculator.getTotalPayment(pair))
.map(calculator::getTotalPayment)
.forEach(System.out::println);
Optional<PaymentCalculator> optional =
cryptoCurrencies.stream()
.filter(cc -> cc.getUnit() == CurrencyUnit.BTC)
.map(cc -> new ImmutablePair(cc.getPrice(), amount))
// .map(pair -> new PaymentCalculator(pair))
.map(PaymentCalculator::new)
.findFirst();
이 중 몇 가지 예시를 알아보자 >_<
public static void main(String[] args) {
List<CryptoCurrency> cryptoCurrencies = SampleData.cryptoCurrencies;
List<CryptoCurrency> result = filter(cryptoCurrencies, cc -> cc.getPrice() > 500_000);
for (CryptoCurrency cc : result) {
System.out.println(cc.getName());
}
}
private static List<CryptoCurrency> filter(List<CryptoCurrency> cryptoCurrencies,
Predicate<CryptoCurrency> p){
List<CryptoCurrency> result = new ArrayList<>();
for (CryptoCurrency cc : cryptoCurrencies) {
if (p.test(cc)) {
result.add(cc);
}
}
return result;
}
public static void main(String[] args) {
String mnemonic = createMnemonic();
System.out.println(mnemonic);
}
private static String createMnemonic() {
return Stream
.generate(() -> getMnemonic())
.limit(12)
.collect(Collectors.joining(" "));
}
private static String getMnemonic() {
List<String> mnemonic = Arrays.asList(
"alpha", "bravo", "charlie",
"delta", "echo", "foxtrot",
"golf", "hotel", "india",
"juliet", "kilo", "lima",
"mike", "november", "oscar",
"papa", "quebec", "romeo",
"sierra", "tango", "uniform",
"victor", "whiskey", "xray",
"yankee", "zulu"
);
Collections.shuffle(mnemonic);
return mnemonic.get(0);
}