44. 표준 함수형 인터페이스를 사용하라.

무한성장개발자·2025년 9월 25일

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

public class UnaryOperatorExample {
    public static void main(String[] args) {
        List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry"));
        System.out.println("Before conversion: " + words);

        // Using UnaryOperator to convert the list to uppercase
        UnaryOperator<String> toUpperCase = String::toUpperCase; // (s1) -> s1.toUpperCase();
        List<String> upperCaseWords = words.stream()
                .map(toUpperCase)
                .collect(Collectors.toList());

        System.out.println("After conversion: " + upperCaseWords);
    }
}

type이 1개이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

public class UnaryOperatorExample {
    public static void main(String[] args) {
        List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry"));
        System.out.println("Before conversion: " + words);

        // Using UnaryOperator to convert the list to uppercase
//        UnaryOperator<String> toUpperCase = String::toUpperCase; // (s1) -> s1.toUpperCase();
        Function<String, String> toUpperCase = String::toUpperCase;
        List<String> upperCaseWords = words.stream()
                .map(toUpperCase)
                .collect(Collectors.toList());

        System.out.println("After conversion: " + upperCaseWords);
    }
}

이것도 가능하다.

unary는 인자로 받는게 딱 하나다라는 의미이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.function.BinaryOperator;

public class BinaryOperatorExample {
    public static void main(String[] args) {
        // Using BinaryOperator to concatenate two strings
        BinaryOperator<String> concatenate = (s1, s2) -> s1 + s2;

        String result = concatenate.apply("Hello, ", "world!");
        System.out.println(result); // Output: Hello, world!
    }
}

Binary에서는 인자로 받는게 2개라는 것이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class PredicateExample {
    public static void main(String[] args) {
        List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry", "blueberry"));
        System.out.println("Original list: " + words);

        // Using Predicate to filter the list for words that start with 'b'
        Predicate<String> startsWithB = s -> s.startsWith("b");
        List<String> filteredWords = words.stream()
                .filter(startsWithB)
                .collect(Collectors.toList());

        System.out.println("Filtered list: " + filteredWords);
    }
}

Predicate는 boolean으로 받는다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

public class FunctionExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("banana", "apple", "cherry");
        System.out.println("Original list: " + words);

        // Using Function to convert the list of strings to their lengths
        Function<String, Integer> stringLength = String::length;
        List<Integer> lengths = words.stream()
                .map(stringLength)
                .toList();

        System.out.println("Lengths: " + lengths);
    }
}

입력이 같지 않은 경우에는 Function으로 정의가 가능하다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.Random;
import java.util.function.Supplier;

public class SupplierExample {
    public static void main(String[] args) {
        // Using Supplier to generate a random number
        Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);

        // Getting a random number
        Integer randomNumber = randomSupplier.get();
        System.out.println("Random number: " + randomNumber);
    }
}

인자가 없고 값을 return만 하는 것이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("banana", "apple", "cherry");
        System.out.println("Original list: " + words);

        // Using Consumer to print each element of the list
        Consumer<String> printWord = System.out::println;
        words.forEach(printWord);
    }
}

전달만 해주는 것이고, return이 없다.

BiConsumer : 2개를 받는거
BiFunction : 2개를 받아서 한개를 return하는 것.

44. 표준 함수형 인터페이스를 사용하라.

핵심정리 2: 직접 정의해서 사용하는 경우

커스텀한 함수라고 볼 수 있다.

package me.whiteship.chapter07.item44.standard_functional_interfaces;

@FunctionalInterface
public interface TriFunction<T, U, V, R> {
    R apply(T t, U u, V v);
}
package me.whiteship.chapter07.item44.standard_functional_interfaces;

public class TriFunctionExample {
    public static void main(String[] args) {
        // Using TriFunction to concatenate three strings
        TriFunction<String, String, String, String> concatenate = (s1, s2, s3) -> s1 + s2 + s3;

        String result = concatenate.apply("Hello, ", "world", "!");
        System.out.println(result); // Output: Hello, world!

        // Using TriFunction to sum three integers
        TriFunction<Integer, Integer, Integer, Integer> sum = (a, b, c) -> a + b + c;

        Integer sumResult = sum.apply(1, 2, 3);
        System.out.println(sumResult); // Output: 6
    }
}

0개의 댓글