ν¨μν μΈν°νμ΄μ€(Functional Interface)
μ¬λ¬ κ°μ λν΄νΈ λ©μλμλ μκ΄μμ΄ μΆμ λ©μλκ° μ€μ§ νλμΈ ν¨μν μΈν°νμ΄μ€μ΄λ€.
λλ€μμ ν¨μν μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘λ§ μμ±λ μ μλ€.
π§ μΈν°νμ΄μ€ λ° μΆμ ν΄λμ€μ μΆμ λ©μλ
μΈν°νμ΄μ€μ μΆμ ν΄λμ€λ μμ(extends) λ°κ±°λ ꡬν(implements)νλ ν΄λμ€κ° μΈν°νμ΄μ€λ μΆμ ν΄λμ€ λ΄ μΆμ λ©μλλ₯Ό ꡬννλλ‘ κ°μ νλ€.
- μΈν°νμ΄μ€ (λ€νμ±μ νΉμ§)
κ³΅ν΅ κΈ°λ₯μ΄ νμν λ μΆμ λ©μλλ₯Ό μ μν΄λκ³ κ΅¬ννλ ν΄λμ€μμ κ° κΈ°λ₯μ μ€λ²λΌμ΄λ© νμ¬ μ¬λ¬ νν, κΈ°λ₯μΌλ‘ ꡬνν μ μλ€.
- μΆμ ν΄λμ€ (μμμ νΉμ§)
μμ κ΄κ³μμ κ°μ λΆλͺ¨ μΆμ ν΄λμ€λ₯Ό μμλ°λ μμ ν΄λμ€ κ°μ κ³΅ν΅ κΈ°λ₯μ κ°κ° ꡬννκ³ νμ₯μν¨λ€.
κ·Έ μ체λ‘λ ν΄λμ€μ μν μ λ€ νμ§ λͺ»νμ§λ§ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλλ° λ°νμ΄ λλ©° νλ μ΄μμ μΆμ λ©μλλ₯Ό κ°μ§κ³ μλ€.
- μΆμ λ©μλ
λ©μλμ μ μΈλΆλ§ μμ±νκ³ κ΅¬νλΆλ μμ±νμ§ μμ μ±λ‘ λ¨κ²¨λμ΄ μμ λ°λ ν΄λμ€μμ ꡬννλλ‘ νλ€.
ν¨μν μΈν°νμ΄μ€ λ§λ€κΈ°
ν¨μν μΈν°νμ΄μ€λ νλμ μΆμ λ©μλλ₯Ό κ°μ ΈμΌ νμ§λ§, μ¬λ¬ κ°μ static λ©μλμ defaultλ₯Ό μ μν μ μλ€.
@FunctionalInterface μ΄λ Έν μ΄μ μ ν¨μν μΈν°νμ΄μ€μ 쑰건μ λΆν©νλμ§ νμΈνμ¬ λ μ΄μμ μΆμ λ©μλκ° μ‘΄μ¬νλ©΄ μ»΄νμΌ μ€λ₯λ₯Ό λ°μμν¨λ€.
@FunctionalInterface
public interface printerInterface<T> {
T printSomething(); // μΆμ λ©μλ
static void printName() {
System.out.println("Kuromi");
}
default void printAge() {
System.out.println("10");
}
}
// μ€μ λ‘ μ¬μ©ν ν΄λμ€ λ΄ κ΅¬ν
printerInterface<String> printerInterface = () -> "hello";
System.out.println(printerInterface.printSomething());
printerInterface.printName();
printerInterface.printAge();
κΈ°λ³Έμ μΌλ‘ μ 곡νλ ν¨μν μΈν°νμ΄μ€
java.lang.function ν¨ν€μ§μ javaμμ κΈ°λ³ΈμΌλ‘ μ 곡νλ ν¨μν μΈν°νμ΄μ€κ° 미리 μ μλμ΄ μλ€.
μ’ λ₯ | μΈμ | λ°ν | λ©μλ | μ€λͺ |
Runnable | void run() | κΈ°λ³Έμ μΈ ννμ μΈν°νμ΄μ€, μΈμμ λ°νκ° λͺ¨λ μμ | ||
Supplier<T> | <T> | T get() | μΈμκ° μμ΄ μ λλ¦ νμ μ λ°νκ°λ§ μλ μΈν°νμ΄μ€, νμ κ°μ κ°μ λ°ν | |
Consumer<T> | <T> | void accept(T t) | μ λλ¦ νμ μ μΈμλ§ μκ³ λ°νκ°μ΄ μλ μΈν°νμ΄μ€ | |
Predicate<T> | <T> | Boolean | boolean test(T t) | μ λλ¦ νμ μ μΈμμ Boolean νμ μ λ°νκ°μ κ°μ§λ μΈν°νμ΄μ€ |
Function<T, R> | <T> | <R> | R apply(T t) | μ λλ¦ νμ μ μΈμμ λ€λ₯Έ μ λλ¦ νμ μ λ°νκ°μ΄ κ°μ΄ μλ μΈν°νμ΄μ€ |
UnaryOperator<T> | <T> | <T> | T apply(T t) | κ°μ μ λλ¦ νμ μ μΈμμ λ°νκ°μ κ°μ§κ³ μλ μΈν°νμ΄μ€ |
BinaryOperator<T> | <T, T> | <T> | R apply(T t, U u) | κ°μ μ λλ¦ νμ μ μΈμ 2κ°λ₯Ό λ°κ³ κ°μ μ λλ¦ νμ μ λ°νκ°μ κ°μ§λ μΈν°νμ΄μ€ |
BiConsumer<T, U> | <T, U> | void accept(T t, U u) | λ€λ₯Έ μ λλ¦ νμ μ μΈμ 2κ°λ₯Ό λ°κ³ λ°νκ°μ΄ μλ μΈν°νμ΄μ€ | |
BiPredicate<T, U> | <T, U> | Boolean | boolean test(T t, U u) | λ€λ₯Έ μ λλ¦ νμ μ μΈμ 2κ°λ₯Ό λ°κ³ Boolean νμ μ λ°νκ°μ κ°μ§λ μΈν°νμ΄μ€ |
BiFunction<T, U, R> | <T, U> | <R> | R apply(T t, U u) | λ€λ₯Έ μ λλ¦ νμ μ μΈμ 2κ°λ₯Ό λ°κ³ λ€λ₯Έ μ λλ¦ νμ μ λ°νκ°μ κ°μ§λ μΈν°νμ΄μ€ |
Comparator<T> | <T, U> | int | κ°μ μ λλ¦ νμ μ μΈμ 2κ°λ₯Ό λ°κ³ Integer λ°νκ°μ κ°μ§λ μΈν°νμ΄μ€, κ°μ²΄κ°μ κ°μ λΉκ΅νκΈ° μν compare κΈ°λ₯μ μν μΈν°νμ΄μ€ |
ν¨μν μΈν°νμ΄μ€ μ¬μ© μμ
1. Predicate : T → boolean
μΈμ νλλ₯Ό λ°μμ boolean νμ μ 리ν΄νλ€.
public interface Predicate<T> {
boolean test(T t);
....
}
import java.util.function.Predicate;
public class Example {
public static void main(String[] args) {
Predicate<Integer> predicate1 = (num) -> num > 0;
System.out.println(predicate1.test(100)); // true
Predicate<Integer> predicate2 = (num) -> num < 100;
System.out.println(predicate1.and(predicate2).test(100)); // false
System.out.println(predicate1.or(predicate2).test(100)); // true
}
}
2. Consumer : T → void
μΈμ νλλ₯Ό λ°κ³ μ무 κ²λ 리ν΄νμ§ μλλ€.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
import java.util.function.Consumer;
import java.util.Arrays;
import java.util.List;
public class Example {
public static void main(String[] args) {
Consumer<String> consumer = s -> System.out.println(s.toUpperCase());
consumer.accept("hello world"); // HELLO WORLD
List<String> list = Arrays.asList("hello", "world");
list.forEach(consumer); // HELLO, WORLD
}
}
3. Supplier : () → T
μ무 κ²λ μ λ ₯ λ°μ§ μκ³ T νμ μ κ°μ²΄λ₯Ό 리ν΄νλ€.
public interface Supplier<T> {
T get();
}
import java.util.function.Supplier;
public class Example {
public static void main(String[] args) {
Supplier<String> supplier= () -> "HelloWorld";
System.out.println(supplier.get()); // HelloWorld
}
}
4. Function : T → R
T νμ μΈμλ₯Ό λ°μ R νμ μ 리ν΄νλ€.
public interface Function<T, R> {
R apply(T t);
}
import java.util.function.Function;
public class Example {
public static void main(String[] args) {
Function<Integer, Integer> func1 = n -> n * 10; // 10λ°°ν κ°
System.out.println(func1.apply(3)); // 30
Function<Integer, String> func2 = n -> "RESULT: " + n; // λ¬Έμμ΄λ‘ λ³κ²½
String result = func1.andThen(func2).apply(3); // func1 λ¨Όμ μ€ν ν κ²°κ³Όκ° func2λ‘ μ λ¬
System.out.println(result); // RESULT: 30
}
}
μ°Έκ³ μλ£ λ° μΆμ² πβοΈ
https://bcp0109.tistory.com/313
https://codechacha.com/ko/java8-predicate-example/
https://zzang9ha.tistory.com/303
'κ°λ° > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Java μ°μ μμ ν(Priority Queue) (0) | 2022.01.17 |
---|---|
[JAVA 8] μ€νΈλ¦Ό(Stream) (0) | 2022.01.15 |
[JAVA 8] λλ€ ννμ (0) | 2022.01.13 |
μλ° Map μμ£Ό μ°λ λ©μλ μ 리 (0) | 2021.11.02 |
μλ° λ°°μ΄, 리μ€νΈ μ λ ¬ (Array, List μ λ ¬) (0) | 2021.11.02 |
λκΈ