μλ°μμ λλ€ μ§μμ΄ μΆκ°λλ©΄μ API μμ± λ°©μμλ ν° λ³νκ° μκ²Όλ€. νΉν, κ³Όκ±°μ ν νλ¦Ώ λ©μλ ν¨ν΄ λμ ν¨μν μΈν°νμ΄μ€λ₯Ό νμ©νλ λ°©μμ΄ μ£Όλͺ©λ°κ³ μλ€.
μ΄λ‘ μΈν΄ ν¨μ κ°μ²΄λ₯Ό λ§€κ°λ³μλ‘ λ°λ μμ±μμ λ©μλλ₯Ό λ λ§μ΄ μμ±νκ² λμμΌλ©°, μ¬λ°λ₯Έ ν¨μν μΈν°νμ΄μ€ νμ μ μ ννλ κ²μ΄ μ€μν΄μ‘λ€. μ¦, ν¨μν λ§€κ°λ³μ νμ μ μ¬λ°λ₯΄κ² μ νν΄μΌ νλ€.
μλ°μ νμ€ λΌμ΄λΈλ¬λ¦¬μμλ μ΄λ―Έ λ€μν μ©λμ νμ€ ν¨μν μΈν°νμ΄μ€κ° μ 곡λκ³ μμΌλ©°, μ΄λ€μ νμ©νλ©΄ λΆνμνκ² μλ‘μ΄ μΈν°νμ΄μ€λ₯Ό μμ±νμ§ μκ³ λ νμν κΈ°λ₯μ ꡬνν μ μλ€. νΉν java.util.function ν¨ν€μ§μλ ν¨μν νλ‘κ·Έλλ°μ μ§μνκΈ° μν΄ μ΄ 43κ°μ ν¨μν μΈν°νμ΄μ€κ° μ€λΉλμ΄ μλ€.
κ³Όκ±°μλ μμ ν΄λμ€μ κΈ°λ³Έ λ©μλλ₯Ό μ¬μ μνμ¬ λμμ λ§μΆ€ μ€μ νλ ν νλ¦Ώ λ©μλ ν¨ν΄μ λ§μ΄ μ¬μ©νλ€. νμ§λ§ ν¨μν μΈν°νμ΄μ€μ λλ€λ₯Ό μ΄μ©νλ©΄ μ΄λ³΄λ€ κ°κ²°νκ³ μ μ§λ³΄μνκΈ° μ’μ APIλ₯Ό λ§λ€ μ μλ€.
μλ μμ λ ν νλ¦Ώ λ©μλ ν¨ν΄μ μ¬μ©ν μ ν΅μ μΈ λ°©μκ³Ό ν¨μν μΈν°νμ΄μ€λ₯Ό νμ©ν νλμ μΈ λ°©μμ λΉκ΅μ΄λ€.
// ν
νλ¦Ώ λ©μλ ν¨ν΄ λ°©μ
class CustomCache<K, V> extends LinkedHashMap<K, V> {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > 100;
}
}μ μ½λλ LinkedHashMapμ νμ₯ν΄ removeEldestEntry λ©μλλ₯Ό μ¬μ μνμ¬ μΊμ κΈ°λ₯μ μΆκ°ν κ²μ΄λ€. λ§΅μ μλ‘μ΄ ν€λ₯Ό μΆκ°νλ put λ©μλλ μ΄ λ©μλλ₯Ό νΈμΆνμ¬ trueκ° λ°νλλ©΄ λ§΅μμ κ°μ₯ μ€λλ μμλ₯Ό μ κ±°νλ€. μ컨λ removeEldestEntryλ₯Ό λ€μμ²λΌ μ¬μ μνλ©΄ λ§΅μ μμκ° 100κ° κ° λ λκΉμ§ 컀μ§λ€κ°, κ·Έ μ΄μμ΄ λλ©΄ μλ‘μ΄ ν€κ° λν΄μ§ λλ§λ€ κ°μ₯ μ€λ λ μμλ₯Ό νλμ© μ κ±°νλ€.
μ¦, κ°μ₯ μ΅κ·Ό μμ 100κ°λ₯Ό μ μ§νλ€.
μ λμνμ§λ§ λλ€λ₯Ό μ¬μ©νλ©΄ ν¨μ¬ μ ν΄λΌ μ μλ€. removeEldestEntry μ μΈμ 보면 μ΄ ν¨μ κ°μ²΄λ Map.Entry<K, V>λ₯Ό λ°μ boolean μ λ°νν΄μΌ ν κ² κ°μ§λ§, κΌ κ·Έλ μ§λ μλ€.γemoveEldestEntryλ size()λ₯Ό νΈ μΆν΄ λ§΅ μμ μμ μλ₯Ό μμλ΄λλ°, removeEldestEntryκ° μΈμ€ν΄μ€ λ©μλλΌμ κ°λ₯ν λ°©μμ΄λ€. νμ§λ§ μμ±μμ λκΈ°λ ν¨μ κ°μ²΄λ μ΄ λ§΅μ μΈμ€ν΄μ€ λ©μλκ° μλλ€.
ν©ν°λ¦¬λ μμ±μλ₯Ό νΈμΆν λλ λ§΅μ μΈμ€ν΄μ€κ° μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ΄λ€. λ°λΌμ λ§΅μ μκΈ° μμ λ ν¨μ κ°μ²΄μ 건λ€μ€μΌ νλ€.
μ΄λ₯Ό λ°μνμ¬ ν¨μν μΈν°νμ΄μ€λ‘ μ ννλ©΄ λ€μκ³Ό κ°μ΄ ꡬνν μ μλ€.
// ν¨μν μΈν°νμ΄μ€ BiPredicateλ₯Ό μ¬μ©νμ¬ μΊμμ λμμ μ μ°νκ² μ€μ νλ λ°©μ
import java.util.function.BiPredicate;
import java.util.LinkedHashMap;
import java.util.Map;
class CustomCache<K, V> extends LinkedHashMap<K, V> {
// μ κ±° κΈ°μ€μ μ μνλ BiPredicate μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ μ‘°κ±΄μ μ μ₯
private final BiPredicate<Map<K, V>, Map.Entry<K, V>> removalCriteria;
// μμ±μμμ μ κ±° κΈ°μ€μ λ°μ
public CustomCache(BiPredicate<Map<K, V>, Map.Entry<K, V>> removalCriteria) {
this.removalCriteria = removalCriteria;
}
// LinkedHashMapμ removeEldestEntry λ©μλλ₯Ό μ¬μ μνμ¬
// μ€μ ν 쑰건μ λ°λΌ μ€λλ νλͺ©μ μ κ±°ν μ§ κ²°μ
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
// BiPredicateλ₯Ό μ¬μ©νμ¬ μ‘°κ±΄μ λ°λΌ true/false λ°ν
return removalCriteria.test(this, eldest);
}
}
// μ¬μ© μ: μΊμ κ°μ²΄ μμ±
// μΊμ κ°μ²΄λ₯Ό μμ±νλ©΄μ mapμ ν¬κΈ°κ° 100μ μ΄κ³Όνλ©΄ κ°μ₯ μ€λλ νλͺ©μ μ κ±°νλλ‘ μ€μ
CustomCache<String, String> cache = new CustomCache<>((map, entry) -> map.size() > 100);- BiPredicate μ¬μ©:
BiPredicate<Map<K, V>, Map.Entry<K, V>>λ₯Ό μ¬μ©νμ¬ λ§΅κ³Ό μνΈλ¦¬λ₯Ό μΈμλ‘ λ°μbooleanκ°μ λ°ννλ 쑰건μ μ€μ νλ€. μ΄ μ‘°κ±΄μremovalCriteriaλΌλ λ³μμ μ μ₯νλ€. - μμ±μ:
CustomCacheν΄λμ€μ μμ±μμμremovalCriteriaλΌλBiPredicateλ₯Ό μΈμλ‘ λ°μ, μΊμμ νλͺ© μ κ±° κΈ°μ€μ μ€μ νλ€. μ΄λ λμ μΌλ‘ 쑰건μ μ§μ ν μ μκ² νλ€. - removeEldestEntry λ©μλ:
LinkedHashMapμremoveEldestEntryλ©μλλ₯Ό μ¬μ μνμ¬,removalCriteriaμ λ°λΌ μ€λλ νλͺ©μ μ κ±°ν μ§ κ²°μ νλ€. μ΄λthis(λ§΅ μ체)μeldest(κ°μ₯ μ€λλ νλͺ©)λ₯Ό μΈμλ‘testλ©μλλ₯Ό νΈμΆνμ¬ κΈ°μ€μ νμΈνλ€. - μ¬μ© μ:
CustomCacheκ°μ²΄λ₯Ό μμ±ν λ λλ€μ(map, entry) -> map.size() > 100μ μ λ¬νμ¬, λ§΅μ ν¬κΈ°κ° 100μ μ΄κ³Όν κ²½μ° κ°μ₯ μ€λλ νλͺ©μ μ κ±°νλλ‘ μ€μ νλ€.
μ΄ μ½λ ꡬ쑰λ μΊμμ νλͺ© μ κ±° κΈ°μ€μ λμ μΌλ‘ μ€μ ν μ μμ΄ μ μ°μ±μ λμ΄λ©°, κΈ°μ‘΄ ν νλ¦Ώ λ©μλ ν¨ν΄λ³΄λ€ κ°κ²°νκ³ λͺ¨λνλ λ°©μμΌλ‘ ꡬνν μ μκ² ν΄μ€λ€.
λλ€λ₯Ό νμ©ν μ΄ λ°©μμ λ μ μ°νλ©°, removeEldestEntryλ₯Ό μ¬μ μν νμ μμ΄ λ€λ₯Έ 쑰건μΌλ‘ μ½κ² λ§μΆ€ μ€μ ν μ μλ€.
μλ°μ java.util.function ν¨ν€μ§μλ λ€μν νμ€ ν¨μν μΈν°νμ΄μ€κ° μ 곡λλ©°, μ΄λ₯Ό νμ©νλ©΄ API μ€κ³κ° λ¨μνκ³ μΌκ΄λκ² μ μ§λλ€.
νμν μ©λμ λ§λ κ² μλ€λ©΄, μ§μ ꡬννμ§ λ§κ³ νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό νμ©νλΌ. κ·Έλ¬λ©΄ APIκ° λ€λ£¨λ κ°λ μ μκ° μ€μ΄λ€μ΄ μ΅νκΈ° λ μ¬μ μ§λ€.
μ컨λ Predicate μΈν°νμ΄μ€λ νλ λν€νΈ(predicate)λ€μ μ‘°ν©νλ λ©μλλ₯Ό μ 곡νλ€. μμ LinkedHashMap μμμλ μ§μ λ§λ EldestEntryRemovalFunction λμ νμ€ μΈν°νμ΄μ€μΈ BiPredicate<Map<K,V>, Map.Entry<K,V>λ₯Ό μ¬μ©ν μ μλ€.
νμ€ ν¨μν μΈν°νμ΄μ€λ ν¬κ² λ€μκ³Ό κ°μ μ νμ΄ μλ€.
κΈ°λ³Έμ μΌλ‘ μλ°μ ν¨μν μΈν°νμ΄μ€λ λ€μκ³Ό κ°μ μ νμΌλ‘ λλ©λλ€. μ΄ μΈν°νμ΄μ€λ€μ κ°μ²΄ μ°Έμ‘° νμ μ μν κΈ°λ³Έ μΈν°νμ΄μ€λ€λ‘, μ€λ¬΄μμ μμ£Ό νμ©λ©λλ€.
| μΈν°νμ΄μ€ | ν¨μ μκ·Έλμ² | μ€λͺ | μ¬μ© μμ |
|---|---|---|---|
UnaryOperator<T> |
T apply(T t) |
μΈμλ₯Ό νλ λ°μ κ°μ νμ μ λ°νν©λλ€. | String::toLowerCase |
BinaryOperator<T> |
T apply(T t1, T t2) |
μΈμλ₯Ό λ κ° λ°μ κ°μ νμ μ λ°νν©λλ€. | BigInteger::add |
Predicate<T> |
boolean test(T t) |
μΈμλ₯Ό νλ λ°μ booleanμ λ°νν©λλ€. |
Collection::isEmpty |
Function<T, R> |
R apply(T t) |
μΈμμ λ°ν νμ μ΄ λ€λ₯Ό λ μ¬μ©ν©λλ€. | Arrays::asList |
Supplier<T> |
T get() |
μΈμλ₯Ό λ°μ§ μκ³ κ°μ λ°νν©λλ€. | Instant::now |
Consumer<T> |
void accept(T t) |
μΈμλ₯Ό νλ λ°κ³ λ°νκ°μ΄ μμ΅λλ€. | System.out::println |
μμ - Predicateμ BiPredicate νμ©
Predicateμ BiPredicateλ 쑰건μ νννλ λ° μ¬μ©λλ©°, κ°κ° νλ λλ λ κ°μ μΈμλ₯Ό λ°μ booleanμ λ°ννλ€. μλ₯Ό λ€μ΄, νΉμ ν¬κΈ° μ΄μμΌ λ μΊμ νλͺ©μ μμ νλλ‘ μ‘°κ±΄μ μ€μ ν μ μλ€.
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.BiPredicate;
class CustomCache<K, V> extends LinkedHashMap<K, V> {
private final BiPredicate<Map<K, V>, Map.Entry<K, V>> removalCriteria;
public CustomCache(BiPredicate<Map<K, V>, Map.Entry<K, V>> removalCriteria) {
this.removalCriteria = removalCriteria;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return removalCriteria.test(this, eldest);
}
}
// μ¬μ© μ: μΊμ ν¬κΈ°κ° 100μ μ΄κ³Όνλ©΄ μ€λλ νλͺ© μ κ±°
CustomCache<String, String> cache = new CustomCache<>((map, entry) -> map.size() > 100);μ μ½λλ BiPredicateλ₯Ό μ¬μ©ν΄ νΉμ ν¬κΈ°λ₯Ό λμ λ μΊμ νλͺ©μ μ κ±°νλλ‘ μ€μ ν μμμ΄λ€.
μμ
-
Predicate - 쑰건 κ²μ¬
Predicate<String> isEmpty = String::isEmpty; System.out.println(isEmpty.test("")); // true System.out.println(isEmpty.test("abc")); // false
-
Function - νμ λ³ν
Function<String, Integer> toLength = String::length; System.out.println(toLength.apply("Hello")); // 5
-
Supplier - κ° μμ±
Supplier<Double> randomSupplier = Math::random; System.out.println(randomSupplier.get()); // 0.12345 (μμμ κ°)
-
Consumer - κ° μλΉ
Consumer<String> print = System.out::println; print.accept("Hello, world!"); // Hello, world!
-
UnaryOperator - κ° λ³ν
UnaryOperator<String> toLowerCase = String::toLowerCase; System.out.println(toLowerCase.apply("HELLO")); // hello
κΈ°μ‘΄μλ 컀μ€ν μΈν°νμ΄μ€λ₯Ό μμ±νμ¬ κΈ°λ₯μ ꡬννλ κ²½μ°κ° λ§μμ§λ§, νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μ΄μ μ λ릴 μ μλ€:
- μ½λμ κ°κ²°μ±: μ€λ³΅λλ μΈν°νμ΄μ€ μμ±μ νΌν μ μλ€.
- APIμ μΌκ΄μ±: μλ° κ°λ°μλ€μ΄ μ΄λ―Έ μ΅μν νμ€ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ―λ‘, μλ‘μ΄ κ°λ μ μ΅ν νμκ° μ€μ΄λ λ€.
- λν΄νΈ λ©μλμ νμ©: νμ€ μΈν°νμ΄μ€λ νμν κ²½μ° λ©μλλ₯Ό μ‘°ν©νκ±°λ λ³νν μ μλ μ μ©ν λν΄νΈ λ©μλλ₯Ό μ 곡νμ¬ λ€λ₯Έ μ½λμ μ½κ² μνΈ μ΄μ©μ΄ κ°λ₯νλ€.
μλ₯Ό λ€μ΄, Predicate μΈν°νμ΄μ€λ 쑰건μ μ‘°ν©ν μ μλ and, or, negate λ©μλλ₯Ό μ 곡νμ¬ λ³΅μ‘ν 쑰건μ κ°νΈνκ² ννν μ μλ€.
κΈ°λ³Έ νμ
μ μν΄ java.util.function ν¨ν€μ§μμλ κΈ°λ³Έ νμ
μ© ν¨μν μΈν°νμ΄μ€λ μ 곡νλ€. λ°μ±μ νΌνκ³ μ±λ₯μ λμ΄κΈ° μν΄ κΈ°λ³Έ νμ
μ μν ν¨μν μΈν°νμ΄μ€ λ³νλ μ 곡νλ€. μλ₯Ό λ€μ΄, IntPredicate, LongFunction, DoubleConsumer λ±μ΄λ€. κΈ°λ³Έ νμ
μ μ§μνλ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λ°μ± μ€λ²ν€λλ₯Ό νΌν μ μμ΄ μ±λ₯μ΄ κ°μ λλ€.
μμ
IntPredicate isEven = x -> x % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // falseμλ° κΈ°λ³Έ νμ μ μν λ³νμ λ€μκ³Ό κ°μ κ·μΉμ λ°λΌ λ€μ΄λ°λλ€.
- νμ
μ λμ΄:
Int,Long,Doubleμ μ¬μ©νμ¬ κΈ°λ³Έ νμ μ λͺ μ - κΈ°λ₯:
Predicate,Function,Consumerλ± μ£Όμ κΈ°λ₯μ λ°μ - λ³ν μμ:
IntPredicate:boolean test(int value)ννλ‘intνμ μ λ°λλ€.LongToIntFunction:int applyAsInt(long value)ννλ‘longνμ μ μΈμλ₯Ό λ°κ³intλ₯Ό λ°ννλ€.
μμ - κΈ°λ³Έ νμ μ© ν¨μν μΈν°νμ΄μ€
κΈ°λ³Έ νμ μ μ¬μ©νμ¬ νΉμ 쑰건μ κ²μ¬νλ μμ
import java.util.function.IntPredicate;
public class BasicTypePredicateExample {
public static void main(String[] args) {
IntPredicate isEven = value -> value % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
}
}μ μμ μμλ IntPredicateλ₯Ό μ¬μ©νμ¬ μ«μκ° μ§μμΈμ§ μ¬λΆλ₯Ό κ²μ¬νλ€.
νμ€ ν¨μν μΈν°νμ΄μ€κ° κ±°μ λλΆλΆμ κ²½μ°λ₯Ό 컀λ²νμ§λ§, λ€μκ³Ό κ°μ κ²½μ°μλ μ§μ μμ±νλ κ²μ΄ λ λμ μ μλ€.
- νΉμ κ·μ½μ λ°λΌμΌ ν κ²½μ°: μλ₯Ό λ€μ΄,
ComparatorλToIntBiFunctionκ³Ό κ΅¬μ‘°κ° λΉμ·νμ§λ§, λΉκ΅ κΈ°λ₯μ λͺ νν λνλ΄κ³ μμΌλ©° νΉμ κ·μ½(μμ λΉκ΅)μ λ°λ₯΄λλ‘ μ€κ³λμ΄ μλ€. - μμ£Ό μ¬μ©λλ©° μ΄λ¦λ§μΌλ‘ μ©λκ° λͺ νν κ²½μ°: μμ£Ό μ¬μ©λλ©° λͺ νν μ΄λ¦μ κ°μ§λ©΄ μ½λ κ°λ μ±μ΄ λμμ§λ€.
- μΆκ°μ μΈ λν΄νΈ λ©μλκ° νμν κ²½μ°: μΈν°νμ΄μ€ λ΄μμ λ©μλλ₯Ό μ‘°ν©νκ±°λ λ³ννλ λν΄νΈ λ©μλκ° νμν κ²½μ°κ° μλ€.
μμ - 3κ°μ λ§€κ°λ³μλ₯Ό λ°λ ν¨μν μΈν°νμ΄μ€
java.util.function ν¨ν€μ§μλ λ§€κ°λ³μ 3κ°λ₯Ό λ°λ ν¨μν μΈν°νμ΄μ€κ° μμΌλ―λ‘, μ§μ μμ±ν μ μλ€.
@FunctionalInterface
interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
// μ¬μ© μμ
TriFunction<Integer, Integer, Integer, Integer> sumThree = (a, b, c) -> a + b + c;
System.out.println(sumThree.apply(1, 2, 3)); // 6μλ‘ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€λ₯Ό κ°μ μμΉμ μΈμλ‘ λ°λ λ©μλλ₯Ό λ€μ€ μ μνλ κ²μ νΌν΄μΌ νλ€. μλ₯Ό λ€μ΄, ExecutorServiceμ submit λ©μλλ Callableκ³Ό Runnableμ λ€μ€ μ μνλλ°, μ΄λ₯Ό μ¬μ©ν λ νλ³νμ΄ νμν κ²½μ°κ° μκΈ΄λ€. μ΄λ λΆνμν νΌλμ μ΄λν μ μλ€.
λ°λΌμ, κ°μ μμΉμ μΈμλ‘ μλ‘ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€λ₯Ό λ°μ§ μλλ‘ μ£Όμνλ κ²μ΄ μ’λ€.
μ΄λ API μ€κ³μμ λͺ¨νΈν¨μ μ€μ΄κ³ , μ¬μ©μκ° μ½λμ μλλ₯Ό λͺ ννκ² μ΄ν΄ν μ μλλ‘ λμμ€λ€.
{% hint style="info" %} μ μ’μ μμ {% endhint %}
μλλ μλ‘ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€(Callableκ³Ό Runnable)λ₯Ό κ°μ μμΉμμ λ°λλ‘ λ€μ€ μ μλ λ©μλ
import java.util.concurrent.Callable;
public class ExecutorServiceExample {
// Runnableμ μΈμλ‘ λ°λ λ©μλ
public void submit(Runnable task) {
System.out.println("Runnable version called");
task.run();
}
// Callableμ μΈμλ‘ λ°λ λ©μλ
public <T> T submit(Callable<T> task) throws Exception {
System.out.println("Callable version called");
return task.call();
}
public static void main(String[] args) throws Exception {
ExecutorServiceExample service = new ExecutorServiceExample();
// Runnableμ μ¬μ©ν κ²½μ°
service.submit(() -> System.out.println("Running task..."));
// Callableμ μ¬μ©ν κ²½μ°
String result = service.submit(() -> {
System.out.println("Calling task...");
return "Task result";
});
System.out.println("Result: " + result);
// νΌλμ μΌμΌν¬ μ μλ λͺ¨νΈν μν©
service.submit((Callable<Void>) () -> {
System.out.println("Ambiguous task...");
return null;
});
}
}submit(Runnable task):RunnableμΈν°νμ΄μ€λ₯Ό λ°λsubmitλ©μλμ΄λ€.submit(Callable<T> task):CallableμΈν°νμ΄μ€λ₯Ό λ°λ μ λ€λ¦submitλ©μλμ΄λ€.- λ λ©μλλ λͺ¨λ κ°μ μ΄λ¦μ
submitλ©μλμ§λ§, μΈμμ νμ λ§ λ€λ₯΄κ² μ μλμ΄ μλ€.
λ¬Έμ μ
μ΄ λ€μ€ μ μλ λ©μλλ Runnableκ³Ό Callable μ€ μ΄λ€ κ²μ νΈμΆν μ§ λͺ¨νΈν κ²½μ°κ° λ°μν μ μλ€. νΉν λλ€ ννμμΌλ‘ μ λ¬ν λ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ΅λλ€. Runnableκ³Ό Callableμ λ λ€ μΈμκ° μμΌλ―λ‘ λλ€μμΌλ‘λ λͺ
νν ꡬλΆλμ§ μλλ€. μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ΄ νΈμΆν λ λ¬Έμ κ° λλ€.
service.submit(() -> {
System.out.println("Ambiguous task...");
return null;
});μ μ½λλ RunnableμΈμ§ CallableμΈμ§ μ»΄νμΌλ¬κ° ꡬλΆνμ§ λͺ»νμ¬ μ€λ₯λ₯Ό λ°μμν¨λ€. μ΄λ₯Ό ν΄κ²°νλ €λ©΄ λͺ
μμ μΈ νλ³νμ΄ νμνλ€.
service.submit((Callable<Void>) () -> {
System.out.println("Callable task...");
return null;
});λͺ
μμ νλ³νμ ν΅ν΄ Callableμ΄λΌλ μλλ₯Ό λͺ
νν νμ§λ§, μ΄λ μ½λλ₯Ό λ 볡μ‘νκ² λ§λ€κ³ μ€μν κ°λ₯μ±μ λμΈλ€.
μ΄ λ¬Έμ λ₯Ό νΌνλ €λ©΄ μλ‘ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€λ₯Ό κ°μ μμΉμ μΈμλ‘ λ°λ λ€μ€ μ μλ₯Ό νΌνλ κ²μ΄ μ’λ€. μλ₯Ό λ€μ΄, submit λ©μλλ₯Ό νλλ‘ ν΅μΌνκ³ , Runnableμ΄λ Callableμ΄ νμν κ²½μ° λνΌ λ©μλλ‘ κ΅¬λΆνλ λ°©μμ΄ κ°λ₯νλ€.
public class ExecutorServiceExample {
public <T> T submitTask(Callable<T> task) throws Exception {
System.out.println("Callable version called");
return task.call();
}
public void submitTask(Runnable task) {
System.out.println("Runnable version called");
task.run();
}
public static void main(String[] args) throws Exception {
ExecutorServiceExample service = new ExecutorServiceExample();
// Runnableλ‘ μ λ¬
service.submitTask(() -> System.out.println("Running task..."));
// Callableλ‘ μ λ¬
String result = service.submitTask(() -> {
System.out.println("Calling task...");
return "Task result";
});
System.out.println("Result: " + result);
}
}μ΄λ κ² λ©μλ μ΄λ¦μ λͺ νν λλμ΄ κ° λ©μλκ° μ΄λ€ μΈν°νμ΄μ€λ₯Ό λ°λμ§ λͺ νν νλ©΄ νΌλμ μ€μΌ μ μλ€.
- ν¨μν μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λλ€ ννμμ νμ©νλ©΄ μ½λκ° κ°κ²°ν΄μ§κ³ μ μ°μ±μ΄ λμμ§λ€.
- νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό μ κ·Ήμ μΌλ‘ νμ©νκ³ , νμν λλ§ μ»€μ€ν μΈν°νμ΄μ€λ₯Ό μ μνλ κ²μ΄ μ’λ€.
Predicate,Function,Supplier,Consumerλ±μ μ£Όμ ν¨μν μΈν°νμ΄μ€λ λλΆλΆμ κ²½μ°λ₯Ό 컀λ²ν μ μμ΄, νμ€ μΈν°νμ΄μ€ μ¬μ©μ μ°μ μ μΌλ‘ κ³ λ €ν΄μΌ νλ€.
- 컀μ€ν ν¨μν μΈν°νμ΄μ€λ₯Ό μ μν λλ λ°λμ λ°λΌμΌ ν κ·μ½μ΄λ μ μ©ν λν΄νΈ λ©μλκ° νμνμ§ κ³ λ―Όν΄λ³΄μμΌ νλ€.
- ν¨μν μΈν°νμ΄μ€λ₯Ό λ€μ€ μ μνλ κ²μ νΌνμ¬ λͺ¨νΈν¨μ λ°©μ§νλ€.
- μλ°μμ νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό μ κ·Ή νμ©νλ©΄ λΆνμν μΈν°νμ΄μ€ μμ±μ μ€μΌ μ μμΌλ©°, APIκ° λ μΌκ΄μ± μκ³ κ°κ²°ν΄μ§λ€.
- κΈ°λ³Έ νμ
μ© μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ¬ μ±λ₯μ μ΅μ νν μ μμ΅λλ€. λ°μ±λ νμ
λμ
IntPredicate,LongFunctionλ± κΈ°λ³Έ νμ μ μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
μλ°μμλ ν¨μν νλ‘κ·Έλλ°μ μ₯μ μ νμ©ν μ μμΌλ―λ‘, API μ€κ³ μ ν¨μν μΈν°νμ΄μ€μ νμ©μ μΌλμ λλ κ²μ΄ μ’λ€.