iterator_stream
Iterator
Iteratorλ 컬λ μ
μ λ°μ΄ν°λ₯Ό μννκ³ μ κ·ΌνκΈ° μν μΈν°νμ΄μ€λ‘, 컬λ μ
ꡬν체μ λ΄λΆ ꡬ쑰λ₯Ό μμ§ λͺ»ν΄λ, μΌκ΄λ λ°©μμΌλ‘ μμμ μ κ·Όν μ μκ² ν΄μ€λ€.
Iterator μΈν°νμ΄μ€μ μ£Όμ λ©μλ
Iterator μΈν°νμ΄μ€λ λ€μκ³Ό κ°μ λ©μλλ₯Ό κ°μ§κ³ μλ€.
boolean hasNext(): λ€μ μμκ° μ‘΄μ¬νλμ§ νμΈνλ λ©μλλ‘, λ€μ μμκ° μμΌλ©΄trueλ₯Ό λ°ννκ³ , λ μ΄μ μνν μμκ° μμΌλ©΄falseλ₯Ό λ°νE next(): λ€μ μμλ₯Ό λ°ν(νΈμΆν λ€μ μμκ° μμ κ²½μ°NoSuchElementExceptionμμΈκ° λ°μ)
public class IteratorExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// Iterator μμ±
Iterator<String> iterator = names.iterator();
// μννλ©΄μ μΆλ ₯
while (iterator.hasNext()) {
String name = iterator.next();
System.out.println(name);
}
}
}μ€νΈλ¦Ό
μλ° 8λΆν° λμ
λ Streamμ λ°μ΄ν° μμ€λ₯Ό μΆμννκ³ , λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° μ μ©ν λ©μλλ€μ μ μν μΈν°νμ΄μ€λ€.
Iterator vs Stream
Iteratorκ° λ°μ΄ν°λ₯Ό μ΄λ»κ² μ²λ¦¬ν μ§ λͺ
μνλ λͺ
λ Ήνimperative λ°©μμ΄λΌλ©΄, Streamμ 무μμ ν μ§λ§ μ μΈνλ μ μΈν λ°©μμ΄λ€.
컬λ μ μμλ₯Ό λλ€μμ νμ©νμ¬ μ²λ¦¬ κ°λ₯νλ©°, Iteratorλ³΄λ€ λ§μ μ°μ°μ μ§μ
λ°μ΄ν° μμ€(λ°°μ΄, 컬λ μ λ±)κ° λ¬΄μμ΄λ λμΌν λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬νμ¬ μ½λμ μ¬μ¬μ©μ± ν₯μ
μ€νΈλ¦Όμ νΉμ§
1. λ°μ΄ν° μμ€ λΆλ³
μ€νΈλ¦Όμ λ°μ΄ν° μμ€λ₯Ό λ³κ²½νμ§ μκ³ , μ°μ° κ²°κ³Όλ‘ μλ‘μ΄ μ€νΈλ¦Όμ λ°ννκ±°λ μ΅μ’ κ²°κ³Όλ₯Ό μμ±νλ€.
2. λ΄λΆ λ°λ³΅
μ€νΈλ¦Όμ μ¬μ©νλ©΄ λ°λ³΅λ¬Έμ λ©μλ νΈμΆμ ν΅ν΄ μμλ₯Ό μ²λ¦¬ν μ μλ€.
3. μ€κ° μ°μ°κ³Ό μ΅μ’
μ°μ°
μ€νΈλ¦Όμ μ°μ°μ νμ΄νλΌμΈ(pipeline)μ ꡬμ±νλ©°, λ κ°μ§ μ νμΌλ‘ λλλ€.
μ€κ° μ°μ°: μ€νΈλ¦Όμ λ°ννλ μ°μ°μΌλ‘, μ€νΈλ¦Όμ μ°μν΄μ μ¬λ¬ κ°μ μ€κ° μ°μ°μ νΈμΆ κ°λ₯
μ΅μ’ μ°μ°: μ€νΈλ¦Όμ λ°ννμ§ μλ μ°μ°μΌλ‘, μ€νΈλ¦Όμ μ΅μ’ μ°μ°μ νΈμΆνλ©΄ μ€νΈλ¦Όμ΄ μλͺ¨
μλͺ¨νκ² λλ©΄, λ μ΄μ μ€νΈλ¦Όμ μ¬μ©ν μ μμ
4. μ§μ° μ°μ°
μ€νΈλ¦Όμ μ€κ° μ°μ°μ μ΅μ’ μ°μ°μ΄ νΈμΆλκΈ° μ κΉμ§λ μ€μ λ‘ μνλμ§ μκ³ , μ΅μ’ μ°μ°μ΄ νΈμΆλλ©΄ νμ΄νλΌμΈμ΄ λμνκΈ° μμνλ€.
μ€νΈλ¦Ό μμ±
λλΆλΆμ λ°μ΄ν° μμ€λ μ€νΈλ¦ΌμΌλ‘ λ³νν μ μλ€.
CollectionμΈν°νμ΄μ€:stream()λ©μλκ° μ μλμ΄ μμ΄ μ»¬λ μ μ μ€νΈλ¦ΌμΌλ‘ λ³ν(μμ ν΄λμ€ λͺ¨λ μ¬μ© κ°λ₯)Arraysν΄λμ€: λ°°μ΄μ μ€νΈλ¦ΌμΌλ‘ λ³ννλstream()λ©μλκ° μ μλμ΄ μμ΄ λ°°μ΄μ μ€νΈλ¦ΌμΌλ‘ λ³νMapμΈν°νμ΄μ€:keySet(),values(),entrySet()λ©μλλ₯Ό μ¬μ©νμ¬ μ€νΈλ¦ΌμΌλ‘ λ³νStreamν΄λμ€(static λ©μλ)Stream.of(1, 2, 3)Stream.empty()Stream.concat(stream1, stream2)
무ν μ€νΈλ¦Ό
Stream.iterate(1, n -> n + 2)Stream.generate(Math::random)
κΈ°λ³Έν μ€νΈλ¦Ό
IntStream.range(1, 10)IntStream.rangeClosed(1, 10)
μ€νΈλ¦Όμ μ€κ° μ°μ°
μ€νΈλ¦Όμ μ΅μ’
μ°μ°
findFirst() vs findAny()
findFirst()μ findAny() λ λ©μλ λͺ¨λ μ°Ύμ 첫 λ²μ§Έ μμλ₯Ό Optional κ°μ²΄λ‘ λ°ννμ§λ§, λ³λ ¬ νκ²½μμ λμμ΄ λ€λ₯΄λ€.
findFirst(): μ¬λ¬ μμκ° μ‘°κ±΄μ λΆν©ν΄λ Streamμ μμλ₯Ό κ³ λ €νμ¬ μ²« λ²μ§Έ μμλ₯Ό λ°νfindAny(): Multiple Threadμμ μ¬λ¬ μμλ₯Ό μ²λ¦¬νλ€κ° κ°μ₯ λ¨Όμ μ°Ύμ μμλ₯Ό λ°ν
κΈ°λ³Έν μ€νΈλ¦Ό (Primitive Stream)
Stream<Integer>, Stream<Double> λ±μ μ¬μ©νλ©΄ κΈ°λ³Ένκ³Ό κ°μ²΄ κ°μ λ³ν(λ°μ±, μΈλ°μ±) μ€λ²ν€λκ° λ°μν μ μκΈ° λλ¬Έμ, κΈ°λ³Ένμ μ§μ λ€λ£¨λ μ€νΈλ¦Όμ μ¬μ©νλ κ²μ΄ μ’λ€.
Stream<T>.mapToInt(ToIntFunction<T> mapper):Stream<T>λ₯ΌIntStreamμΌλ‘ λ³ννIntStream.sum(),IntStream.average(): κΈ°λ³Ένμ νΉνλ μ§κ³ λ©μλ μ 곡IntStream.boxed():IntStreamμ λ€μStream<Integer>λ‘ λ³νIntStream,LongStream,DoubleStreamμ¬μ© κ°λ₯
μ°Έκ³ μλ£
Last updated
Was this helpful?