item 47 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 47λ₯Ό μμ½ν λ΄μ© μ λλ€.
μμ μνμ€, μ¦ μΌλ ¨μ μμλ₯Ό λ°ννλ λ©μλλ μμμ΄ λ§λ€.
- Collection
- Set
- List
- Iterable
- Array
for-each
λ¬Έμμλ§ μ°μ΄κ±°λ λ°νλ μμ μνμ€κ° (μ£Όλ‘ contains(Object) κ°μ) μΌλΆ Collection
λ©μλλ₯Ό ꡬνν μ μμ λλ Iterable
μΈν°νμ΄μ€λ₯Ό μΌλ€. λ°ν μμλ€μ΄ κΈ°λ³Έ νμ
μ΄κ±°λ μ±λ₯μ λ―Όκ°ν μν©μ΄λΌλ©΄ λ°°μ΄
μ μΌλ€.
Iterable, Array μ¬μ© μμ κ° νμνλ€
μ€νΈλ¦Ό
μ λ°λ³΅(Iteration
)μ μ§μνμ§ μλλ€. λ°λΌμ μ€νΈλ¦Ό
κ³Ό λ°λ³΅
μ μλ§κ² μ‘°ν©ν΄μΌ μ’μ μ½λκ° λμ¨λ€.
μ¬μ€ Stream
μΈν°νμ΄μ€λ Iterable
μΈν°νμ΄μ€κ° μ μν μΆμ λ©μλλ₯Ό μ λΆ ν¬ν¨ν λΏλ§ μλλΌ, Iterable
μΈν°νμ΄μ€κ° μ μν λ°©μλλ‘ λμνλ€. κ·ΈλΌμλ for-each
λ‘ μ€νΈλ¦Όμ λ°λ³΅ν μ μλ κΉλμ λ°λ‘ Stream
μ΄ Iterable
μ νμ₯(extend
)νμ§ μμμλ€.
public interface Stream<T> extends BaseStream<T, Stream<T>> {
/**
* Returns a stream consisting of the elements of this stream that match
* the given predicate.
*
κ°μ²΄ μνμ€λ₯Ό λ°ννλ λ©μλλ₯Ό μμ±νλλ°, μ΄ λ©μλκ° μ€μ§ μ€νΈλ¦Ό νμ΄νλΌμΈ
μμλ§ μ°μΌ κ±Έ μλ€λ©΄ λ§μ λκ³ μ€νΈλ¦Ό
μ λ°ννκ² ν΄μ£Όμ.
Collection
μΈν°νμ΄μ€λ Iterable
μ νμ νμ
μ΄κ³ stream
λ©μλλ μ 곡νλ λ°λ³΅
κ³Ό μ€νΈλ¦Ό
μ λμμ μ§μνλ€. λ°λΌμ μμ μνμ€λ₯Ό λ°ννλ κ³΅κ° API
μ λ°ν νμ
μλ Collection
μ΄λ κ·Έ νμ νμ
μ μ°λ κ² μΌλ°μ μΌλ‘ μ΅μ μ΄λ€. νμ§λ§ λ¨μ§ 컬λ μ
μ λ°ννλ€λ μ΄μ λ‘ λ©μΉ ν° μνμ€λ₯Ό λ©λͺ¨λ¦¬μ μ¬λ €μλ μ λλ€.
λ°νν μνμ€
κ° ν¬μ§λ§ ννμ κ°κ²°νκ² ν μ μλ€λ©΄ μ μ© μ»¬λ μ
μ ꡬννλ λ°©μμ κ²ν ν΄λ³΄μ.
public class PowerSet {
public static final <E> Collection<Set<E>> of(Set<E> s) {
List<E> src = new ArrayList<>(s);
if (src.size() > 30)
throw new IllegalArgumentException(
"μ§ν©μ μμκ° λ무 λ§μ΅λλ€.(μ΅λ 30κ°)".: + s);
return new AbstractList<Set<E>>() {
@Override public int size() {
// λ©±μ§ν©μ ν¬κΈ°λ 2λ₯Ό μλ μ§ν©μ μμ μλ§νΌ κ±°λμ κ³±κ³Ό κ°λ€.
return 1 << src.size();
}
@Override public boolean contains(Object o) {
return o instanceof Set && src.containsAll((Set)o);
}
@Override public Set<E> get(int index) {
Set<E> result = new HashSet<>();
for (int i = 0; index != 0; i++, index >>=1)
if ((index & 1) == 1)
result.add(src.get(i));
return result;
}
};
}
}
AbstractCollection
μ νμ©ν΄μ Collection
ꡬν체λ₯Ό μμ±ν λλ Iterable
μ© λ©μλ μΈμ 2κ°λ§ λ ꡬννλ©΄ λλ€. λ°λ‘ contains
μ size
λ€.
μ€νΈλ¦Όμ λ°ννλ λ κ°μ§ ꡬνμ μμλ΄€λλ° λͺ¨λ μΈλ§μ νλ€. νμ§λ§ λ°λ³΅μ μ¬μ©νλ κ² λ μμ°μ€λ¬μ΄ μν©μμλ μ¬μ©μλ κ·Έλ₯ μ€νΈλ¦Ό
μ μ°κ±°λ Stream
μ Iterable
λ‘ λ³νν΄μ£Όλ μ΄λν°λ₯Ό μ΄μ©ν΄μΌ νλ€. νμ§λ§ μ΄λ¬ν μ΄λν°
λ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μ΄μμ νκ² λ§λ€κ³ 2,3λ°°κ° λ λ리λ€.
μμ μνμ€
λ₯Ό λ°ννλ λ©μλλ₯Ό μμ±ν λλ, μ΄λ₯Ό μ€νΈλ¦Ό
μΌλ‘ μ²λ¦¬νκΈ°λ₯Ό μνλ μ¬μ©μμ λ°λ³΅
μΌλ‘ μ²λ¦¬νκΈΈ μνλ μ¬μ©μκ° λͺ¨λ μμ μ μμμ λ μ¬λ¦¬κ³ , μμͺ½μ λ€ λ§μ‘±μν€λ € λ
Έλ ₯νμ. 컬λ μ
μ λ°νν μ μλ€λ©΄ κ·Έλ κ² νλΌ. λ°ν μ λΆν° μ΄λ―Έ μμλ€μ 컬λ μ
μ λ΄μ κ΄λ¦¬νκ³ μκ±°λ 컬λ μ
μ νλ λ λ§λ€μ΄λ λ μ λλ‘ μμ κ°μκ° μ λ€λ©΄ ArrayList
κ°μ νμ€ μ»¬λ μ
μ λ΄μ λ°ννλΌ. κ·Έλ μ§ μμΌλ©΄ μ μ© μ»¬λ μ
μ ꡬνν μ§ κ³ λ―ΌνλΌ. 컬λ μ
μ λ°ννλ κ² λΆκ°λ₯νλ©΄ μ€νΈλ¦Ό
κ³Ό Iterable
μ€ λ μμ°μ€λ¬μ΄ κ²μ λ°ννλΌ. λ§μ½ λμ€μ Stream
μΈν°νμ΄μ€κ° Iterable
μ μ§μνλλ‘ μλ°κ° μμ λλ€λ©΄, κ·Έλλ μμ¬νκ³ μ€νΈλ¦Όμ λ°ννλ©΄ λ κ²μ΄λ€(μ€νΈλ¦Ό μ²λ¦¬
μ λ°λ³΅
λͺ¨λμ μ¬μ©ν μ μμΌλ)