item 21 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 21λ₯Ό μμ½ν λ΄μ© μ λλ€.
μλ° 8μ μμ κΈ°μ‘΄ μΈν°νμ΄μ€μ λ©μλλ₯Ό μΆκ°ν μ μλλ‘ λν΄νΈ λ©μλ
λ₯Ό μκ°νμ§λ§ μνμ΄ μμ ν μ¬λΌμ§ κ²μ μλλ€.
μλ° 8μμλ ν΅μ¬ 컬λ μ
μΈν°νμ΄μ€
λ€μ λ€μμ λν΄νΈ λ©μλκ° μΆκ°λμλ€. μ£Όλ‘ λλ€
λ₯Ό νμ©νκΈ° μν΄μλ€. λλΆλΆ μν©μμ μ λμνμ§λ§ μκ°ν μ μλ λͺ¨λ μν©μμ λΆλ³μ
μ ν΄μΉμ§ μλ λν΄νΈ λ©μλλ₯Ό μμ± νκΈ°λ μ΄λ €μ΄ λ²μ΄λ€.
λν΄νΈ λ©μλλ 무μμΈκ°?
μλ° 8μμλ νΈνμ±μ μ μ§νλ©΄μ APIλ₯Ό λ°κΏ μ μλλ‘ μλ‘μ΄ κΈ°λ₯μΈ λν΄νΈ λ©μλλ₯Ό μ 곡νλ€. μλ° 8 API μμλ λν΄νΈ λ©μλκ° μλΉν λ§μ΄ νμ© λμμ κ² μμ μΆμΈ‘ν μ μλ€. Collection μΈν°νμ΄μ€μ stream λ©μλμ²λΌ λΆμ§λΆμκ°μ λ§μ λν΄νΈ λ©μλλ₯Ό μ¬μ©νλ€. List μΈν°νμ΄μ€μ sort λ©μλλ λν΄νΈ λ©μλλ€. μ΄μ μ μ΄ν΄λ³Έ Predicate, Function, Comparator λ± λ§μ ν¨μν μΈν°νμ΄μ€λ Predicate.and λλ Function.andThen κ°μ λ€μν λν΄νΈ λ©μλλ₯Ό ν¬ν¨νλ€.
- JAVA 8 IN ACTION λ°μ·
μλ° 8μ Collection
μΈν°νμ΄μ€μ μΆκ°λ removeIf
λ©μλλ₯Ό μλ‘ μκ°ν΄λ³΄μ. μ΄ λ©μλλ μ£Όμ΄μ§ λΆλ¦¬μΈ ν¨μ(predecate; νλ λν€νΈ)κ° trueλ₯Ό λ°ννλ λͺ¨λ μμλ₯Ό μ κ±°νλ€.
default boolean removeIf(predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean result = false;
for (Iterator<E> it = iterator(); it.hasNext(); ) {
if (filter.test(it.next())) {
it.remove();
result = true;
}
return result;
}
μ μ½λλ λ²μ©μ
μΌλ‘ ꡬνλμμ§λ§ νμ‘΄νλ λͺ¨λ Collection ꡬν체μ μ μ΄μ°λ¬μ§λ κ²μ μλλ€.
SynchronizedCollection
μ΄ λνμ μΈ μλ€. μνμΉ λ²μ μ ν΄λΌμ΄μΈνΈκ° μ 곡ν κ°μ²΄λ‘ λ½
μ κ±°λ κΈ°λ₯μ μΆκ°λ‘ μ 곡νλ€. μ¦, λͺ¨λ λ©μλμμ μ£Όμ΄μ§ λ½ κ°μ²΄λ‘ λκΈ°ν
ν ν λ΄λΆ 컬λ μ
κ°μ²΄μ κΈ°λ₯μ μμνλ λνΌ ν΄λμ€λ€. λ°λΌμ SynchronizedCollection μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μ€λ λκ° κ³΅μ νλ νκ²½μμ ν μ€λ λκ° removeIf
λ₯Ό νΈμΆνλ©΄ concurrentModificationException
μ΄ λ°μνκ±°λ λ€λ₯Έ μκΈ°μΉ λͺ»ν κ²°κ³Όλ‘ μ΄μ΄μ§ μ μλ€.
μλ° νλ«νΌ λΌμ΄λΈλ¬λ¦¬ μμλ μ΄λ° λ¬Έμ λ₯Ό μλ°©
νκΈ° μν΄ μΌλ ¨μ μ‘°μΉλ₯Ό μ·¨νλ€. μλ₯Ό λ€μ΄ ꡬνν μΈν°νμ΄μ€μ λν΄νΈ λ©μλλ₯Ό μ¬μ μ
νκ³ , λ€λ₯Έ λ©μλ μμλ λν΄νΈ λ©μλλ₯Ό νΈμΆνκΈ° μ μ νμν μμ
μ μννλλ‘ νλ€.
μ컨λ Collections.synchronizedCollectionμ΄ λ°ννλ package-private
ν΄λμ€ λ€μ removeIf
λ₯Ό μ¬μ μ
νκ³ , μ΄λ₯Ό νΈμΆνλ λ€λ₯Έ λ©μλλ€μ λν΄νΈ ꡬνμ νΈμΆνκΈ° μ μ λκΈ°ν
λ₯Ό νλλ‘ νλ€.
public class SynchronizedCollection<E> implements Collection<E>, Serializable {
...
/**
* @since 4.4
*/
@Override
public boolean removeIf(final Predicate<? super E> filter) {
synchronized (lock) {
return decorated().removeIf(filter);
}
}
}
λν΄νΈ λ©μλλ (μ»΄νμΌμ μ±κ³΅νλλΌλ) κΈ°μ‘΄ ꡬν체μ λ°νμ μ€λ₯λ₯Ό μΌμΌν¬ μ μλ€. μλ° 8μ 컬λ μ μΈν°νμ΄μ€μ κ½€ λ§μ λν΄νΈ λ©μλλ₯Ό μΆκ°νκ³ , κ·Έ κ²°κ³Ό κΈ°μ‘΄μ μ§μ¬μ§ λ§μ μλ° μ½λκ° μν₯μ λ°μ κ²μΌλ‘ μλ €μ‘λ€.
λν΄νΈ λ©μλλ μΈν°νμ΄μ€λ‘λΆν° λ©μλλ₯Ό μ κ±°
νκ±°λ κΈ°μ‘΄ λ©μλμ μκ·Έλμ²λ₯Ό μμ
νλ μ©λκ° μλμ λͺ
μ¬ν΄μΌ νλ€. μ΄λ° ννλ‘ μΈν°νμ΄μ€λ₯Ό λ³κ²½νλ©΄ λ°λμ κΈ°μ‘΄ ν΄λΌμ΄μΈνΈλ₯Ό λ§κ°λ¨λ¦¬κ² λλ€.
μλ‘μ΄ μΈν°νμ΄μ€λΌλ©΄ λ¦΄λ¦¬μ€ μ μ λ°λμ ν μ€νΈλ₯Ό κ±°μ³μΌ νλ€.