π‘ μ€νΈλ¦Ό(Stream)μ μλ° 8 λΆν° μΆκ°λ κΈ°λ₯μΌλ‘, 컬λ μ μ μ μ₯λ μ리먼νΈλ€μ νλμ© μννλ©΄μ μ²λ¦¬ν μ μλ κΈ°λ₯μ΄λ€. λλ€μκ³Ό ν¨κ» μ¬μ©ν μ μμΌλ©° 컬λ μ μ λ€μ΄μλ λ°μ΄ν°μ λν μ²λ¦¬λ₯Ό κ°κ²°νκ² ννν μ μλ€.
λν λ΄λΆ λ°λ³΅μλ₯Ό μ¬μ©νκΈ° λλ¬Έμ λ³λ ¬μ²λ¦¬κ° μ½λ€λ μ₯μ μ΄ μλ€.
μλ° 8 μ΄μ μ λ°°μ΄ λλ 컬λ μ
λ€λ£¨λ λ°©λ²μ for
, foreach
λ₯Ό μ¬μ©νμ¬ μ리먼νΈλ€μ κΊΌλ΄μ λ€λ£¨λ λ°©λ²μ΄μλ€. κ°λ¨ν κ²½μ° μκ΄ μμ§λ§ μ½λ μμ΄ λ§μμ§μλ‘ λ³΅μ‘μ±μ΄ λ§μ΄ μ¬λΌκ°κ² λμλ€.
μ€νΈλ¦Όμ μ΄μ©νλ©΄ λ°°μ΄ λλ 컬λ μ μ ν¨μ μ¬λ¬ κ°λ₯Ό μ¬μ©ν΄μ κ²°κ³Όλ₯Ό μ½κ² μ»μ μ μλ€.
μ€νΈλ¦Όμ μ¬μ©νλ©΄ λλ€μμ νμ©ν΄ μ½λ μλ μ€μ΄κ³ κ°κ²°νκ² ννλ κ°λ₯νλ€.
μ€νΈλ¦Όμ λ νλμ μ₯μ μ λ³λ ¬μ²λ¦¬κ° κ°λ₯νλ€λ κ²μ΄λ€.
Java 6 μ΄μ μ iterator
λ₯Ό μ¬μ©νμ¬ μ리먼νΈλ₯Ό μννμλ€.
iterator
μ²λΌ νλ²λ§ μ¬μ©λκ³ μ¬λΌμ§λ€. νμνλ©΄ λ€μ μ€νΈλ¦Όμ μμ±ν΄μΌ νλ€.μ€νΈλ¦Όμ ν¬κ² μμ±, κ°κ³΅, κ²°κ³Ό 3κ°μ§λ‘ ꡬλΆλλ€.
λ°°μ΄, 컬λ μ
-> μ€νΈλ¦Ό μμ± -> λ§€ν -> νν°λ§ -> κ²°κ³Ό
μλ°μμλ μμ£Ό μ¬μ©νλ λ°°μ΄κ³Ό 컬λ μ
κ°μ²΄μμ stream()
λ©μλλ₯Ό μ§μνλ€.
μ΄ λ©μλλ₯Ό μ¬μ©νλ©΄ μ€νΈλ¦Όμ΄ μμ±λλ€. μ΄ μΈ λ€μν λ°©λ²μΌλ‘ μ€νΈλ¦Όμ μμ±ν μλ μλ€.
stream()
μ¬μ©public static void main(String[] args) {
String[] strArr = new String[]{"hello", "stream", "world"};
Stream<String> stringStream1 = Arrays.stream(strArr);
Stream<String> stringStream2 = Arrays.stream(strArr, 0, 2); // μΈλ±μ€ 0, 1 μΆλ ₯(2 μ μΈ)
`
stringStream1.forEach(str -> System.out.print(str + " "));
System.out.println();
stringStream2.forEach(str -> System.out.print(str + " "));
}
hello stream world
hello stream
stream()
λ₯Ό μ¬μ©ν μ μλ€.public static void main(String[] args) {
List<String> stringList = Arrays.asList("hello", "stream", "world");
Stream<String> stringStream = stringList.stream();
Stream<String> parallelStream = stringList.parallelStream(); // λ³λ ¬ μ²λ¦¬ μ€νΈλ¦Ό
}
public Stream<String> streamOf(List<String> list) {
return list == null || list.isEmpty()
? Stream.empty()
: list.stream();
}
public static void main(String[] args) {
Stream<String> builderStream =
Stream.<String>builder()
.add("hello")
.add("stream")
.add("world")
.build();
builderStream.forEach(str -> System.out.print(str + " "));
}
hello stream world
iterate()
λ©μλλ₯Ό μ¬μ©νμ¬ μμ΄ ννλ‘ μ€νΈλ¦Όμ μμ±ν μ μλ€.public static void main(String[] args) {
Stream<Integer> stream = Stream.iterate(10, x -> x * 2).limit(10);
stream.forEach(val -> System.out.print(val + " "));
}
μ€νΈλ¦Όμ μ λ€λ¦μ μ¬μ©νμ§ μκ³ κΈ°λ³Έ νμ
μΌλ‘ μ€νΈλ¦Όμ μμ±ν μ μλ€. (range()
μ rangeClosed()
λ λ²μ μ°¨μ΄λ€.)
μ λ€λ¦μ μ¬μ©νμ§ μκΈ° λλ¬Έμ λΆνμν μ€ν λ°μ±λ μΌμ΄λμ§ μλλ€.
νμν κ²½μ°μλ boxed()
λ₯Ό μ¬μ©ν΄ λ°μ±μ ν μλ μλ€.
public static void main(String[] args) {
IntStream intStream = IntStream.range(5, 10); // 5, 6, 7, 8, 9
LongStream longStream = LongStream.rangeClosed(1, 3); // 1, 2, 3
Stream<Double> boxedDoubleStream = new Random().doubles(5).boxed();
intStream.forEach(i -> System.out.print(i + " "));
System.out.println();
longStream.forEach(l -> System.out.print(l + " "));
System.out.println();
boxedDoubleStream.forEach(d -> System.out.print(d + " "));
}
5 6 7 8 9
1 2 3
0.003291382437904611 0.9568968822141412 0.1968739072117316 0.5724730036434903 0.1273612419533796
public static void main(String[] args) {
IntStream intStream = "Hello Stream World".chars();
Stream<String> stringStream = Pattern.compile(",").splitAsStream("Hello,Stream,World");
intStream.forEach(i -> System.out.print(i + " "));
System.out.println();
stringStream.forEach(s -> System.out.print(s + " "));
}
72 101 108 108 111 32 83 116 114 101 97 109 32 87 111 114 108 100
Hello Stream World
public static void main(String[] args) {
Stream<String> stringStream1 = Stream.of("Hello", "Stream", "World");
Stream<String> stringStream2 = Stream.of("Java", "Spring", "SpringBoot");
Stream<String> concatStream = Stream.concat(stringStream1, stringStream2);
concatStream.forEach(s -> System.out.print(s + " "));
}
Hello Stream World Java Spring SpringBoot
μ€νΈλ¦Όμ μλ λ°μ΄ν°μ λν΄ λ΄κ° μνλ κ²°κ³Όλ₯Ό λ§λ€κΈ° μν΄μ μ€κ° μ²λ¦¬ μμ μ κ°κ³΅μ΄λΌκ³ νλ€.
μ€νΈλ¦Όμμλ λ°μ΄ν°λ₯Ό κ°κ³΅ν μ μλ λ©μλλ€μ μ 곡νλλ°, ν΄λΉ λ©μλλ€μ Streamμ μ λ¬λ°μ Streamμ λ°ννλ―λ‘ μ°μν΄μ λ©μλλ₯Ό μ°κ²°ν μ μλ€. λν Stream κ°κ³΅ν λμ νν°-λ§΅(filter-map) κΈ°λ° APIλ₯Ό μ¬μ©νκΈ° λλ¬Έμ μ§μ°μ°μ°μ ν΅ν΄ μ±λ₯ μ΅μ νκ° κ°λ₯νλ€.
μμΈ μν | λ©μλ |
---|---|
νν°λ§ | filter(), distinct() |
λ³ν | map(), flatMap() |
μ ν | limit(), skip() |
μ λ ¬ | sorted() |
κ²°κ³Ό νμΈ | peek() |
Predicate
λ boolean
μ 리ν΄νλ ν¨μν μΈν°νμ΄μ€μ΄λ€.Stream<T> filter(Predicate<? super T> predicate);
map()
λ©μλλ κ°μ κ°κ³΅ν μ μλ λλ€μμ λ§€κ°λ³μλ‘ λ°λλ€. <R> Stream<R> map(Function<? super T, ? extends R> mapper);
flatMap()
μ map()
κ³Ό λΉμ·νμ§λ§ μ‘°κΈ λ 볡μ‘ν μμ
μ νλλ° νμΈν΄λ³΄μ.<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
sorted()
λ©μλλ₯Ό μ¬μ©νλ€.κ°κ³΅λ μ€νΈλ¦Όμ ν΅ν΄ μ΄μ λ κ²°κ³Όλ₯Ό λ§λ€μ΄ λ΄λ μμ μ΄ νμνλ€.
μ΄ κ³Όμ μ λ°μ΄ν°λ₯Ό νν°λ§νκ³ κ°κ³΅ν λ€μ μΆλ ₯νκΈ° μν΄μ μ§ννλ μμ μ΄λ€.
μ€νΈλ¦Όμμλ λ€μν λ©μλλ€μ μ 곡νλλ°, λ¨Όμ μ΅μ/μ΅λ/μ΄ν©/νκ· λ± κ³Ό κ°μ κ²°κ³Όλ₯Ό μμ보μ.
λ§μ½ μ€νΈλ¦Όμ΄ λΉμ΄ μμΌλ©΄ count μ sumμ 0μ μΆλ ₯ν κ²μ΄λ€.
public static void main(String[] args) {
long count = IntStream.range(1, 10).count();
long sum = IntStream.range(1, 10).sum();
OptionalInt max = IntStream.range(1, 10).max();
OptionalInt min = IntStream.range(1, 10).min();
int OddSum = IntStream.range(1, 10)
.filter(i -> i % 2 == 1)
.sum();
}
reduce()
λΌλ λ©μλλ μ€νΈλ¦Όμ μλ λ°μ΄ν°λ€μ μ΄ν©μ κ³μ°ν΄μ€λ€. reduce()
νλΌλ―Έν°μ λ°λΌ 3κ°μ§ μ’
λ₯κ° μλ€.// 1κ° (accumulator)
Optional<T> reduce(BinaryOperator<T> accumulator);
// 2κ° (identity)
T reduce(T identity, BinaryOperator<T> accumulator);
// 3κ° (combiner)
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
collect()
λ Collector νμ
μ λ°μμ μ²λ¦¬νλλ°, ν΄λΉ λ©μλλ₯Ό ν΅ν΄ 컬λ μ
μ μΆλ ₯μΌλ‘ λ°μ μ μλ€.
collect()
λ©μλλ Collector κ°μ²΄μμ μ 곡νλ μ μ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
Collectors.toList()
- μ€νΈλ¦Ό μμ
κ²°κ³Όλ₯Ό 리μ€νΈλ‘ λ°νν΄μ£Όλ λ©μλμ΄λ€.
Collectors.joining()
- μ€νΈλ¦Όμ μμ
κ²°κ³Όλ₯Ό String νμ
μΌλ‘ μ΄μ΄ λΆμΈλ€.
- μΈκ°μ μΈμλ₯Ό λ°μ μ μλ€. κ° μΈμλ delimiter(ꡬλΆμ), prefix(맨 μ λ¬Έμ), suffix(맨 λ€ λ¬Έμ) μ΄λ€.
Matching
μ Predicate λ₯Ό μΈμλ‘ λ°μ 쑰건μ λ§μ‘±νλ μ리먼νΈκ° μλμ§ νμΈνκ³ boolean
μΌλ‘ 리ν΄ν΄μ€λ€.