item 44 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ λ“±μž₯

μžλ°”κ°€ λžŒλ‹€λ₯Ό μ§€μ›ν•˜λ©΄μ„œ, ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ˜ 맀λ ₯이 쀄고 ν•¨μˆ˜ 객체λ₯Ό λ°›λŠ” 정적 νŒ©ν„°λ¦¬λ‚˜ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λŠ” 방식이 μ£Όλͺ©(?)을 λ°›κ³  μžˆλ‹€.

LinkedHashMap의 removeEldestEntry을 예λ₯Ό λ“€μ–΄λ³΄μž.

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return false;
}
void afterNodeInsertion(boolean evict) { // possibly remove eldest
        LinkedHashMap.Entry<K,V> first;
        if (evict && (first = head) != null && removeEldestEntry(first)) {
            K key = first.key;
            removeNode(hash(key), key, null, false, true);
        }
}

μœ„ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ©΄ μΊμ‹œλ‘œ μ‚¬μš©ν•  μˆ˜κ°€ μžˆλ‹€.

LinkedHashMap을 μ˜€λŠ˜λ‚  λ‹€μ‹œ κ΅¬ν˜„ν•œλ‹€λ©΄ ν•¨μˆ˜ 객체λ₯Ό λ°›λŠ” 정적 νŒ©ν„°λ¦¬λ‚˜ μƒμ„±μžλ₯Ό μ œκ³΅ν–ˆμ„ 것이닀.

@FunctionalInterface interface EldestEntryRemovalFunction<K,V> {
        boolean remove(Map<K,V> map, Map.Entry<K,V> eldest); 
}

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

μ΄λ ‡κ²Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, java.util.function νŒ¨ν‚€μ§€ μ•ˆμ— λ‹€μ–‘ν•œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€

μ •μ˜λ˜μ–΄ 있기 λ•Œλ¬Έμ— 이 ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό 적극 ν™œμš©ν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€.

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λŠ” μœ μš©ν•œ λ””ν΄νŠΈ λ©”μ„œλ“œλ“€λ„ 많이 μ œκ³΅ν•œλ‹€λŠ” μž₯점도 μžˆλ‹€.

ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μ’…λ₯˜

java.util.function νŒ¨ν‚€μ§€μ—” 총 43개의 μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆμ§€λ§Œ, 이 쀑 6개의 κΈ°λ³Έ ν˜•νƒœμ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œ κΈ°μ–΅ν•˜λ©΄

λ‚˜λ¨Έμ§€ μΈν„°νŽ˜μ΄μŠ€λ“€μ„ μœ μΆ”ν•΄λ‚Ό 수 μžˆλ‹€.

  • UnaryOperator / T apply(T t) / String::toLowerCase
  • BinaryOperator / T apply(T t1, T t2) / BigInteger::add
  • Predicate / boolean test(T t) / Collection::isEmpty
  • Function<T,R> / R apply(T t) / Arrays.asList
  • Supplier / T get() / Instant:now
  • Consumer / void accept(T t) / System.out::println

이 κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λ“€μ€ κΈ°λ³Έ νƒ€μž…μΈ int, long, double용으둜 각 3κ°œμ”© λ³€ν˜•μ΄ μƒκ²¨λ‚œλ‹€.

IntPredicate / LongPredicate / DoublePredicate

λ˜ν•œ Function μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λ³Έ νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” λ³€ν˜•μ΄ 총 9κ°œκ°€ 더 μžˆλ‹€.

IntToDoubleFunction / IntToLongFunction / IntUnaryOperator(μΈμˆ˜μ™€ 같은 νƒ€μž…μ„ λ°˜ν™˜)

그리고 κΈ°λ³Έ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 쀑 μ•„λž˜ 3κ°œμ—λŠ” 인수λ₯Ό 2κ°œμ”© λ°›λŠ” λ³€ν˜• μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€.

BiPredicate<T, U> / BiFunction<T, U, R> / BiConsumer<T, U>

BiFunction<T, U, R>μ—λŠ” λ‹€μ‹œ κΈ°λ³Έ νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” μ„Έ λ³€ν˜•

ToIntBiFunction<T, U> / ToLongBiFunction<T, U> / ToDoubleFunction 이 μžˆλ‹€.

Consumer에도 객체 참쑰와 κΈ°λ³Έ νƒ€μž… ν•˜λ‚˜, 즉 인수λ₯Ό 2개 λ°›λŠ” λ³€ν˜•μΈ

ObjDoubleConsumer / ObjIntConsumer / ObjLongConsumer κ°€ 쑴재 ν•œλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ BooleanSupplier μΈν„°νŽ˜μ΄μŠ€λŠ” boolean을 λ°˜ν™˜ν•˜λ„λ‘ ν•œ Supplier의 λ³€ν˜•μ΄λ‹€.

⚠️ **GitHub.com Fallback** ⚠️