Stream APIλ?
Java 8μμ λμ λ Stream APIλ λ°μ΄ν° μ²λ¦¬(νν°λ§, λ³ν, μ§κ³ λ±)λ₯Ό ν¨μν μ€νμΌλ‘ μμ±ν μ μλλ‘ λλ λꡬμ΄λ€. κΈ°μ‘΄μ for 루ν κΈ°λ° μ²λ¦¬λ³΄λ€ κ°κ²°νκ³ κ°λ μ± λμ μ½λλ₯Ό μμ±ν μ μκ² λμμ€λ€.
Streamμ ν¬κ² μ€κ° μ°μ°κ³Ό μ΅μ’
μ°μ°μΌλ‘ λλλ€.
λ°μ΄ν°λ₯Ό λ³ν, νν°λ§, μ λ ¬νλ κ³Όμ μ λ΄λΉνλ©° Stream νμ΄νλΌμΈμ μ€κ° λ¨κ³μμ μ€νλλ€. μ΄ κ³Όμ μμ μ§μ° μ°μ°μ΄ μΌμ΄λλ€.
# μ§μ° μ°μ° - μ΅μ’
μ°μ°μ΄ νΈμΆλκΈ° μ κΉμ§ μ€μ μ²λ¦¬κ° μ΄λ£¨μ΄μ§μ§ μκ³ μ΅μ’
μ°μ° μμ μ ν λ²μ μ€νλλ λμ λ°©μ
λνμ μΈ μ€κ° μ°μ° λ©μλλ λ€μκ³Ό κ°λ€.
filter(Predicate) // 쑰건μ λ§λ μμλ§ νν°λ§νλ€.
map(Function) // μμλ₯Ό λ€λ₯Έ ννλ‘ λ³ννλ€.
flatMap(Function) // μ€μ²©λ ꡬ쑰λ₯Ό ννν νλ€.
sorted() / sorted(Comparator) // μμλ₯Ό μ λ ¬νλ€.
distinct() // μ€λ³΅μ μ κ±°νλ€.
limit(long) // μμμλΆν° nκ°λ§ μ ννλ€.
skip(long) // μμμλΆν° nκ° κ±΄λλ΄λ€.
peek(Consumer) // μμλ₯Ό μλΉνμ§ μκ³ μ€κ°μ νμΈνλ€.
μ€κ° μ°μ°μμ μ μν μ²λ¦¬ κ·μΉμ μ€μ λ‘ μ€ννμ¬ κ²°κ³Όλ₯Ό μμ±νλ λ¨κ³λ‘ μ΅μ’
μ°μ°μ΄ νΈμΆλλ μκ° μμ νμ΄νλΌμΈμ μμ¬ μλ μ€κ° μ°μ°λ€μ΄ ν λ²μ μ€νλκ³ μ€νΈλ¦Όμ΄ λ«νλ€. μ΅μ’
μ°μ°μ΄ μνλ μ΄νμλ ν΄λΉ μ€νΈλ¦Όμ λ€μ μ¬μ©ν μ μλ€.
λνμ μΈ μ΅μ’
μ°μ° λ©μλλ λ€μκ³Ό κ°λ€.
forEach(Consumer) // κ° μμμ λν΄ μμ
μ μννλ€.
collect(Collector) // κ²°κ³Όλ₯Ό 컬λ μ
μ΄λ λ€λ₯Έ νμμΌλ‘ λ³ννλ€.
reduce(BinaryOperator) // μμλ₯Ό νλμ κ°μΌλ‘ μ§κ³νλ€.
count() // μμμ κ°μλ₯Ό λ°ννλ€.
anyMatch(Predicate) // 쑰건μ λ§μ‘±νλ μμκ° νλλΌλ μλμ§ κ²μ¬νλ€.
allMatch(Predicate) // λͺ¨λ μμκ° μ‘°κ±΄μ λ§μ‘±νλμ§ κ²μ¬νλ€.
noneMatch(Predicate) // λͺ¨λ μμκ° μ‘°κ±΄μ λ§μ‘±νμ§ μλμ§ κ²μ¬νλ€.
findFirst() // 첫 λ²μ§Έ μμλ₯Ό λ°ννλ€.
findAny() // μμ μ€ νλλ₯Ό λ°ννλ€. (λ³λ ¬ μ²λ¦¬ μ μ£Όλ‘ μ¬μ©)
min(Comparator) / max(Comparator) // μ΅μκ° / μ΅λκ°μ λ°ννλ€.
Javaμμλ λ€μν λ°©λ²μΌλ‘ Streamμ μμ±ν μ μλ€.
// 1. 컬λ μ
μμ μμ±
List<String> list = List.of("Blue", "Cool", "Good");
Stream<String> stream1 = list.stream();
// 2. λ°°μ΄μμ μμ±
String[] arr = {"This", "is", "Array"};
Stream<String> stream2 = Arrays.stream(arr);
// 3. μ«μ λ²μμμ μμ±
IntStream intStream = IntStream.range(1, 5);
LongStream longStream = LongStream.rangeClosed(1, 5);
// 4. μ§μ μμ±
Stream<Double> randoms = Stream.generate(Math::random).limit(5);
// 5. λΉλ μ¬μ©
Stream<String> buildStream = Stream.<String>builder()
.add("This")
.add("is")
.add("Builder")
.build();
μ€νΈλ¦Ό μμ±λΆν° μ°μ°κΉμ§μ νλ¦μ λ€μκ³Ό κ°λ€.
List<String> names = List.of("BlueCool", "PYO", "MIN", "BlueMin");
// κΈΈμ΄κ° 4λ³΄λ€ ν° μ΄λ¦λ§ νν°λ§ -> λλ¬Έμλ‘ λ³ν -> μνλ²³μ μ λ ¬ -> μΆλ ₯
names.stream()
.filter(name -> name.length() > 4) // μ€κ° μ°μ°: 쑰건 νν°λ§ (Predicate)
.map(String::toUpperCase) // μ€κ° μ°μ°: λ¬Έμμ΄ λλ¬Έμ λ³ν (Function)
.sorted() // μ€κ° μ°μ°: μνλ²³μ μ λ ¬
.forEach(System.out::println); // μ΅μ’
μ°μ°: μμ μΆλ ₯ (Consumer)
Stream APIμ κ°μ₯ ν° μ₯μ μ κ°κ²°νκ³ κ°λ
μ± λμ μ½λλ₯Ό μμ±ν μ μλ€λ μ μ΄λ€. κΈ°μ‘΄μ λ°λ³΅λ¬Έ κΈ°λ° μ½λμ λΉν΄ μ²λ¦¬ κ³Όμ μ μ§§κ³ λͺ
ννκ² ννν μ μμΌλ©° filter(), map(), sorted()μ κ°μ μ°μ°μ 체μ΄λνμ¬ β무μμ ν μ§βμ μ§μ€νλ μ μΈν νλ‘κ·Έλλ° μ€νμΌμ΄ κ°λ₯ν΄μ§λ€.
Streamμ μμ£Ό νΈλ¦¬νμ§λ§ λͺ¨λ μν©μμ νμ μ΅μ μ μ νμ μλλ€. μ°μ Streamμ 1νμ±μ΄λ―λ‘ ν λ² μ΅μ’
μ°μ°μ μννλ©΄ μ¬μ¬μ©μ΄ λΆκ°νλ©° λ°μ΄ν° ν¬κΈ°κ° μκ±°λ λ¨μν μ°μ°μμλ κΈ°μ‘΄μ λ°λ³΅λ¬Έλ³΄λ€ μ€νλ € μ±λ₯μ΄ λ¨μ΄μ§ μ μλ€.
νΉν κΈ°λ³Ένμ΄ μλ κ²½μ°μλ λ°μ±(Boxing)κ³Ό μΈλ°μ±(Unboxing) κ³Όμ μμ λΆνμν μ€λ²ν€λκ° λ°μν μ μκ³ μ°μ°μ΄ 체μ΄λλλ©΄ μ€κ° κ³Όμ μ λλ²κΉ
μ΄ μ΄λ ΅κΈ° λλ¬Έμ νμν κ²½μ° peek() λ±μ νμ©νμ¬ μ€κ° κ°μ νμΈνλ κ²μ΄ μ€μνλ€.
