[Java] Lambda, Stream
π Lambda Function
Lambda
ν¨μλ ν¨μλ₯Ό νλμ μμ²λΌ νννλ λ°©λ²μ΄λ€. ν¨μλͺ
μ΄ μκΈ° λλ¬Έμ βμ΅λͺ
ν¨μβλΌκ³ λΆλ₯΄κΈ°λ νλ€. μ΅λͺ
ν¨μλ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ μ·¨κΈλλ―λ‘ βμΌκΈ κ°μ²΄βμ΄λ€. μΌκΈ κ°μ²΄λ λ€λ₯Έ κ°μ²΄λ€μκ² μΌλ°μ μΌλ‘ μ μ© κ°λ₯ν μ°μ°μ λͺ¨λ μ§μνλ κ°μ²΄λ‘, μ΅λͺ
ν¨μ λν μ μλ λ¬Έμμ΄κ³Ό λμΌν λ°©λ²μΌλ‘ λ€λ£° μ μμμ μλ―Ένλ€.
1
(λ§€κ°λ³μ λͺ©λ‘) -> { ν¨μ λ΄λΆ }
μμ κ°μ ννλ₯Ό λλ€ ν¨μλΌκ³ νλ€.
1
2
3
4
5
6
7
8
// κΈ°μ‘΄ ν¨μ
public int add(int x, int y) {
return x + y;
}
// λλ€ ν¨μ
(int x, int y) -> x + y
λ€μκ³Ό κ°μ΄ λλ€ ν¨μλ‘ λ³νν μ μλ€.
1
(x, y) -> x + y
μ»΄νμΌλ¬κ° λ§€κ°λ³μ νμ μ μΆλ‘ ν μ μλ κ²½μ° μλ΅ν μ μλ€.
1
x -> x * 2
λ§€κ°λ³μκ° νλλΌλ©΄ κ΄νΈλ₯Ό μλ΅ν μ μλ€. λ¨, λ§€κ°λ³μκ° μλ€λ©΄ λΉ κ΄νΈλ₯Ό μ¬μ©ν΄μΌ νλ€.
1
(x, y) -> x + y
ν¨μ λ΄λΆκ° ν μ€μ΄λΌλ©΄ μ€κ΄νΈ λ° return
μ μλ΅ν΄μΌ νλ€.
π Functional Interface
ν¨μν μΈν°νμ΄μ€λ μ€μ§ νλμ μΆμ λ©μλλ§μ κ°λ μΈν°νμ΄μ€μ΄λ€. @FunctionalInterface
μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ μ μΈνλ€. μ΄ μ΄λ
Έν
μ΄μ
μ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° ν¨μν μΈν°νμ΄μ€κ° λκΈ° μν 쑰건μ λ§μ‘±νλμ§ νμΈνλ€.
ν¨μν μΈν°νμ΄μ€κ° λκΈ° μν 쑰건μ λ€μκ³Ό κ°λ€.
- λ¨ νλμ μΆμ λ©μλλ₯Ό κ°μ ΈμΌ νλ€.
default
,static
λ©μλλ μ¬λ¬ κ° μ‘΄μ¬ν΄λ 무방νλ€.
Consumer
Consumer
μΈν°νμ΄μ€λ νλμ μΈμλ₯Ό λ°μ λ‘μ§μ μννκ³ μ무κ²λ 리ν΄νμ§ μλ μ°μ°μ μ μν λ μ¬μ©νλ€.
1
2
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello, Lambda!");
accept
λ Consumer
μΈν°νμ΄μ€μ μΆμ λ©μλλ‘, T
νμ
μ μΈμλ₯Ό λ°μ λ‘μ§μ μννλ€. λ¦¬ν΄ νμ
μ void
μ΄λ€.
Supplier
Supplier
μΈν°νμ΄μ€λ μΈμλ₯Ό λ°μ§ μκ³ μ€μ§ κ°μ 리ν΄νλ μ°μ°μ μ μν λ μ¬μ©νλ€.
1
2
Supplier<User> userSupplier = () -> new User("κΈ°λ³Έμ¬μ©μ", 0);
User defaultUser = userSupplier.get();
get
μ Supplier
μ μΆμ λ©μλλ‘, T
νμ
μ κ°μ²΄λ₯Ό 리ν΄νλ€.
Function<T, R>
Function
μΈν°νμ΄μ€λ νλμ μΈμλ₯Ό λ°μ νΉμ νμ
μ κ²°κ³Όλ₯Ό 리ν΄νλ μμ
μ μ μν λ μ¬μ©νλ€.
1
2
Function<Integer, Integer> square = x -> x * x;
System.out.println(square.apply(4));
apply
λ Function
μ μΆμ λ©μλλ‘, T
νμ
μ μΈμλ₯Ό λ°μ R
νμ
μ κ²°κ³Όλ₯Ό 리ν΄νλ€.
Predicate
Predicate
μΈν°νμ΄μ€λ νλμ μΈμλ₯Ό λ°μ boolean
κ°μ 리ν΄νλ μΈν°νμ΄μ€μ΄λ€.
1
2
Predicate<String> isEmpty = s -> s.isEmpty();
System.out.println(isEmpty.test(""));
test
λ Predicate
μ μΈν°νμ΄μ€λ‘ 쑰건μ λ§μΌλ©΄ true
, κ·Έλ μ§ μμΌλ©΄ false
λ₯Ό 리ν΄νλ€.
π Stream
Stream
APIλ Java 8λΆν° λμ
λμμΌλ©°, 컬λ μ
, λ°°μ΄ λ±κ³Ό κ°μ λ°μ΄ν°λ₯Ό ν¨μν νλ‘κ·Έλλ° μ€νμΌλ‘ λ€λ£° μ μλλ‘ νλ λꡬμ΄λ€.
μ€νΈλ¦Ό νμ΄νλΌμΈμ ν¬κ² μμ±, μ€κ° μ°μ°, μ΅μ’
μ°μ°μΌλ‘ λλλλ°, μ€κ° μ°μ°μ μ΅μ’
μ°μ°μ΄ νΈμΆλ λκΉμ§ μ€μ λ‘ μ°μ°λμ§ μλλ€. μ΄λ₯Ό Lazy Evaluation
μ΄λΌκ³ νλ€.
λν μ€νΈλ¦Όμ λ©ν° μ°λ λλ₯Ό ν΅ν λ³λ ¬ μ°μ°μ΄ κ°λ₯νλ€. μ°μ°μ μννμ¬λ μλ³Έμ λ³κ²½λμ§ μμΌλ©° μλ‘μ΄ μ€νΈλ¦Ό λλ κ²°κ³Όκ° λ¦¬ν΄λλ€. ν λ² μ΅μ’ μ°μ°μ μνν μ€νΈλ¦Όμ λ€μ μ¬μ©ν μ μλ€.
1
2
3
4
5
6
7
8
9
// λλ€ ν¨μ
List<String> upper1 = names.stream()
.map(s -> s.toUpperCase())
.collect(Collectors.toList());
// λ©μλ μ°Έμ‘°
List<String> upper2 = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
μ€νΈλ¦Όμ λλ€ ν¨μλ₯Ό μ¬μ©ν μ μμ§λ§, λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©νλ©΄ λ κ°κ²°ν΄μ§κ³ κ°λ μ±μ΄ μ’μμ§λ κ²½μ°κ° μλ€.
π Stream μμ±
1
2
3
4
List<String> list = List.of("A", "B", "C");
Stream<String> sequential = list.stream();
Stream<String> parallel = list.parallelStream();
Collection
μ μμν ν΄λμ€λ stream
κ³Ό parallelStream
λ©μλλ₯Ό ν΅ν΄ μ€νΈλ¦Ό λλ λ³λ ¬ μ€νΈλ¦Όμ μμ±ν μ μλ€.
1
2
String[] array = {"X", "Y", "Z"};
Stream<String> stream1 = Arrays.stream(array);
λ°°μ΄ λν stream
λ©μλλ₯Ό ν΅ν΄ μ€νΈλ¦Όμ μμ±ν μ μλ€.
1
2
Stream<String> s1 = Stream.of("A", "B", "C");
Stream<Integer> s2 = Stream.of(1, 2, 3, 4);
Stream.of
λ©μλλ₯Ό ν΅ν΄ μμλ₯Ό μ§μ μ§μ νμ¬ μ€νΈλ¦Όμ μμ±ν μ μλ€.
1
2
3
4
5
Stream<String> builtStream = Stream.<String>builder()
.add("A")
.add("B")
.add("C")
.build();
Stream.builder
λ©μλλ₯Ό ν΅ν΄ λΉλ ν¨ν΄μ μ¬μ©νμ¬ μ€νΈλ¦Όμ μ¬μ©ν μ μλ€.
1
2
3
4
5
6
7
8
Stream.iterate(0, n -> n + 1)
.limit(10)
.forEach(System.out::println);
Stream.iterate(0,
n -> n < 10, // μ’
λ£ μ‘°κ±΄
n -> n + 1)
.forEach(System.out::println);
iterate
λ©μλλ₯Ό ν΅ν΄ μ€νΈλ¦Όμ μμ±ν μ μλ€. iterate
λ μ΄κΈ°κ°κ³Ό μ°μ° ν¨μλ₯Ό μ
λ ₯λ°μ 무ν μ€νΈλ¦Όμ μμ±νλ€.
Java 9λΆν° μ’ λ£ μ‘°κ±΄μ ν¨κ» λ겨 μ ν μ€νΈλ¦Όμ μμ±ν μ μλ€.
π μ€κ° μ°μ°
filter
1
Stream<T> filter(Predicate<? super T> predicate)
filter
λ©μλλ μ€νΈλ¦Ό λ΄ μμλ₯Ό μ£Όμ΄μ§ 쑰건μ λ§λ μμλ§ νν°λ§νμ¬ μλ‘μ΄ μ€νΈλ¦ΌμΌλ‘ 리ν΄νλ€. Predicate<T>
λ₯Ό μΈμλ‘ λ°μ test
λ©μλλ₯Ό ν΅ν΄ κ° μμκ° μ‘°κ±΄μ λ§μ‘±νλμ§ νμΈνλ€.
filter
λ₯Ό μ¬λ¬ λ² μ¬μ©νλ κ²½μ° filter(a).filter(b)
λμ filter(a.and(b))
μ κ°μ΄ μ¬μ©νλ κ²μ΄ μ±λ₯μ μΌλ‘ λμμ΄ λλ€. νν°λ§μ νμκ° μ€μ΄λ€κΈ° λλ¬Έμ΄λ€.
1
2
3
4
5
6
List<String> names = List.of("Alice", "Bob", "Charlie", "David");
List<String> filteredNames= names.stream()
.filter(name -> name.startsWith("C"))
.collect(Collectors.toList());
// ["Charlie"]
map
1
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
map
λ©μλλ μ€νΈλ¦Όμ κ° μμλ₯Ό λ€λ₯Έ ννλ‘ λ³ννμ¬ μλ‘μ΄ μ€νΈλ¦Όμ μμ±νλ μ°μ°μ΄λ€. Function<T, R>
λ₯Ό μΈμλ‘ λ°μΌλ©°, T
λ μλ³Έ μ€νΈλ¦Ό μμμ νμ
, R
μ 리ν΄λ μ€νΈλ¦Όμ μμ νμ
μ΄λ€.
κΈ°μ‘΄ κ°μ μ§μ λ³κ²½νλ κ²μ΄ μλλΌ μλ‘μ΄ κ°μ μμ±νλ κ²μ μ£Όμν΄μΌ νλ€.
1
2
3
4
5
6
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
// [1, 4, 9, 16, 25]
flatMap
1
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
map
λ©μλλ κ° μμλ₯Ό μΌλμΌ λ§€ννμ¬ κ²°κ³Όκ° Stream<Stream<R>>
μ΄ λμ§λ§, flatMap
λ©μλλ κ° μμλ₯Ό Stream
μΌλ‘ λ§€νν ν ννννμ¬ Stream<R>
ννλ‘ λ§λ λ€. λ°λΌμ flatMap
λ΄λΆμμ λ°λμ Stream
μ 리ν΄νλλ‘ ν΄μΌ νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
List<List<String>> characters = List.of(
List.of("A","B"),
List.of("C","D")
);
characters.stream()
.flatMap(list -> list.stream())
.forEach(System.out::println);
// A
// B
// C
// D
sorted
1
2
3
4
Stream<T> sorted();
// 컀μ€ν
μ λ ¬
Stream<T> sorted(Comparator<? super T> comparator);
sorted
λ©μλλ μ€νΈλ¦Ό λ΄ μμλ₯Ό μ λ ¬νμ¬ μλ‘μ΄ μ€νΈλ¦Όμ 리ν΄νλ€. μ€νΈλ¦Όμ μμκ° Comparable<T>
λ₯Ό ꡬνν΄μΌ νλ€. λλ Comparable<T>
λ₯Ό μΈμλ‘ λ겨 컀μ€ν
μ λ ¬μ μνν μ μλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class User {
String name;
int age;
}
List<User> users = List.of(
new User("Alice", 30),
new User("Bob", 25),
new User("Charlie", 28)
);
List<User> byAge = users.stream()
.sorted(Comparator.comparing(User::getAge))
.collect(Collectors.toList());
// Bob(25), Charlie(28), Alice(30)
distinct
1
Stream<T> distinct();
distinct
λ©μλλ μ€νΈλ¦Όμ μμ μ€ λμΌν κ°μ΄ μ¬λ¬ λ² λ±μ₯νλ©΄ 첫 λ²μ§Έ μμλ§ λ¨κΈ°κ³ λλ¨Έμ§λ νν°λ§νμ¬ μμ±λ μλ‘μ΄ μ€νΈλ¦Όμ 리ν΄νλ€. λ΄λΆμ μΌλ‘ equals
λλ hashCode
λ©μλλ₯Ό ν΅ν΄ μ€λ³΅μ νλ¨νλ€. λ°λΌμ μ¬μ©μ μ μ κ°μ²΄μμ distinct
λ©μλλ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ equals
λ hashCode
λ©μλλ₯Ό μ€λ²λΌμ΄λν΄μΌ νλ€.
1
2
3
4
5
6
List<Integer> list = List.of(1, 2, 2, 3, 1, 4);
List<Integer> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
// [1, 2, 3, 4]
limit
1
Stream<T> limit(long maxSize)
limit
λ©μλλ μ€νΈλ¦Όμ μμμ κ°μλ₯Ό μ΅λ maxSize
λ‘ μ ννμ¬ μ²μλΆν° μ§μ λ κ°μλ§νΌ μ΄λ£¨μ΄μ§ μ€νΈλ¦Όμ 리ν΄νλ€.
1
2
3
4
5
List<Integer> evens = Stream.iterate(0, n -> n + 2)
.limit(10)
.collect(Collectors.toList());
// [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
skip
1
Stream<T> skip(long n)
skip
λ©μλλ μ²μ nκ°μ μμλ₯Ό 건λλ°κ³ λλ¨Έμ§ μμλ§μΌλ‘ μ΄λ£¨μ΄μ§ μ€νΈλ¦Όμ 리ν΄νλ€. λ§μ½ μ€νΈλ¦Ό μμμ μκ° nλ³΄λ€ μμΌλ©΄ λΉ μ€νΈλ¦Όμ 리ν΄νλ€.
1
2
3
4
5
6
List<String> items = List.of("A", "B", "C", "D", "E", "F");
List<String> result = items.stream()
.skip(2)
.collect(Collectors.toList());
// [C, D, E, F]
peak
1
Stream<T> peek(Consumer<? super T> action)
peak
λ©μλλ νΉμ μμ μ μμλ₯Ό μ΄ν΄λ³΄κ³ μΆκ°μ μΈ λμμ μννλ€. μ£Όλ‘ νμ΄νλΌμΈ μ€κ°μ κ°μ λ‘κΉ
ν λ μ¬μ©νλ€.
1
2
3
4
Stream.of(1, 2, 3, 4, 5)
.peek(i -> log.debug("κ°: {}", i))
.filter(i -> i % 2 == 0)
.forEach(System.out::println);
π μ΅μ’ μ°μ°
forEach
1
void forEach(Consumer<? super T> action)
forEach
λ©μλλ μ€νΈλ¦Όμ μμμ λν΄ μ§μ λ λμμ μννκ³ λ¦¬ν΄κ° μμ΄ μ’
λ£νλ μν μ νλ€.
λ³λ ¬ μ€νΈλ¦Όμ μ¬μ©νλ κ²½μ° μλ³Έ λ°μ΄ν°μ μμλ₯Ό 보μ₯νμ§ μλλ€. λ³λ ¬ μ€νΈλ¦Όμμ μμ λν 보μ₯νκΈ° μν΄μ forEachOrdered
λ₯Ό μ¬μ©ν΄μΌ νλ€.
1
2
3
4
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
numbers.stream()
.forEach(System.out::println);
collect
1
<R, A> R collect(Collector<? super T, A, R> collector)
collect
λ©μλλ μ€νΈλ¦Ό μμλ€μ 컨ν
μ΄λλ‘ ν©μΉλ μν μ νλ€. T
λ μ€νΈλ¦Όμ μμ νμ
, A
λ μ€νΈλ¦Ό λ΄λΆμμ κ°μ μ μ μ μ₯νλ μμ 컨ν
μ΄λ, R
μ μ΅μ’
κ²°κ³Όμ νμ
μ΄λ€. λ³΄ν΅ Collectors
μμ 미리 μ μλ ν©ν 리 λ©μλλ₯Ό μ¬μ©νλ€.
A
λAccumulator
(λμ°κΈ°)λΌκ³ λΆλ₯Έλ€.
1
2
3
4
Map<Character, List<String>> grouped =
Stream.of("apple", "banana", "avocado")
.collect(Collectors.groupingBy(s -> s.charAt(0)));
// {'a': ["apple","avocado"], 'b': ["banana"]}
reduce
reduce
λ©μλλ μ€νΈλ¦Όμ μμλ€μ νλμ κ²°κ³Όλ‘ κ²°ν©ν λ μ¬μ©νλ€. μ£Όλ‘ μ§κ³ μ°μ°μ μ¬μ©λλ€.
reduce
λ μ΄ μΈ κ°μ§μ μ€λ²λ‘λ©λ λ©μλλ₯Ό μ 곡νλ€.
1
Optional<T> reduce(BinaryOperator<T> accumulator)
μ€νΈλ¦Όμ μμ μ€ μ²« λ²μ§Έλ₯Ό accumulator
μ μ΄κΈ°κ°μΌλ‘ μ¬μ©νμ¬ λ¨μ μμλ₯Ό μ°¨λ‘λ‘ κ²°ν©νλ€.
1
2
3
4
List<Integer> nums = List.of(1, 2, 3, 4);
Optional<Integer> sum = nums.stream()
.reduce((a, b) -> a + b);
// 10
1
2
T reduce(T identity,
BinaryOperator<T> accumulator)
μ΄κΈ°κ° identity
λ₯Ό λͺ
μνκ³ κ·Έ μ΄ν μμλ€μ μ°¨λ‘λλ‘ κ²°ν©νλ€. μ΄μ μλ Optional
λ‘ λ¦¬ν΄κ°μ λ°μλλ°, μ΄λ²μλ λΉ μ€νΈλ¦Ό λν identity
λ₯Ό 리ν΄νκΈ° λλ¬Έμ T
νμ
μΌλ‘ 리ν΄κ°μ λ°λλ€.
1
2
3
4
List<Integer> nums = List.of(1, 2, 3, 4);
int product = nums.stream()
.reduce(1, (a, b) -> a * b);
// 24
1
2
3
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner)
μ λ©μλλ λ³λ ¬ μ€νΈλ¦Όμμ μμ£Ό μ¬μ©νλ©°, U
νμ
μΌλ‘ accumulator
λ₯Ό λ§λ€κ³ , κ° μμλ₯Ό λμ νμ¬ μ€κ° κ²°κ³Όλ₯Ό μμ±νκ³ , μ΅μ’
μ μΌλ‘ μ΄λ₯Ό combiner
λ‘ ν©μ³ 리ν΄νλ€.
1
2
3
4
5
6
7
8
List<String> words = List.of("Java", "Stream", "API");
int totalLength = words.parallelStream()
.reduce(
0,
(sum, w) -> sum + w.length(),
Integer::sum
);
// 13
streamμ μ§κ³ ν¨μ
1
long count()
count
λ©μλλ μ€νΈλ¦Όμ ν¬ν¨λ μμμ μ΄ κ°μλ₯Ό long
νμ
μΌλ‘ 리ν΄νλ€. λ΄λΆμ μΌλ‘ λͺ¨λ μμλ₯Ό μννμ¬ κ°μλ₯Ό μΈκ³ κ²°κ³Όλ₯Ό 리ν΄νλ€. λΉ μ€νΈλ¦Όμ κ²½μ° 0μ 리ν΄νλ©°, 무ν μ€νΈλ¦ΌμΈ κ²½μ° count
λ©μλλ μ’
λ£λμ§ μλλ€.
1
2
3
List<String> fruits = List.of("apple", "banana", "cherry", "durian");
long count = fruits.stream().count();
// 4
1
int sum() // IntStreamμ κ²½μ°
sum
λ©μλλ μ€νΈλ¦Όμ λͺ¨λ μμμ ν©μ 리ν΄νλ€. μ€νΈλ¦Όμ λͺ¨λ μμλ₯Ό λ΄λΆ λ²νΌμ μ μ₯ν ν 0μ μ΄κΈ°κ°μΌλ‘ νμ¬ μμλ₯Ό μ°¨λ‘λ‘ λνλ€.
1
2
3
int total = IntStream.of(10, 20, 30, 40, 50)
.sum();
// 150
1
Optional<T> max(Comparator<? super T> comparator)
max
λ©μλλ μ€νΈλ¦Ό μμ μ€ κ°μ₯ ν° κ°μ 리ν΄νλ€. κ°μ²΄ μ€νΈλ¦ΌμΈ κ²½μ° Comparator
λ₯Ό μΈμλ‘ λ겨주μ΄μΌ νλ€.
1
2
3
4
List<String> names = List.of("Alice", "Bob", "Charlie");
Optional<String> opt = names.stream()
.max(Comparator.naturalOrder());
find κ³μ΄
1
Optional<T> findFirst()
findFirst
λ©μλλ μ€νΈλ¦Όμ 첫 λ²μ§Έ μμλ₯Ό νμνμ¬ λ¦¬ν΄νλ€. μ΄λ λ³λ ¬ μ€νΈλ¦Όμμλ λ§μ°¬κ°μ§μ΄λ€. μ¦, findFirst
λ©μλλ λ΄λΆμ μΌλ‘ κ°μ₯ μμ μΈλ±μ€λ₯Ό κ°μ§ μμλ₯Ό 리ν΄νλ€.
1
2
3
4
5
6
List<String> list = List.of("A1", "A2", "A3", "A4");
Optional<String> firstParallel = list.parallelStream()
.filter(s -> s.startsWith("A"))
.findFirst();
System.out.println(firstParallel.get());
// A1
1
Optional<T> findAny()
findAny
λ©μλλ μ€νΈλ¦Όμμ μμμ μμλ₯Ό μ°Ύμ Optional<T>
λ‘ λ¦¬ν΄νλ€. μμ°¨ μ€νΈλ¦ΌμΈ κ²½μ° findFirst
λ©μλμ λμΌνκ² λμνλ©°, λ³λ ¬ μ€νΈλ¦ΌμΈ κ²½μ° κ° μ°λ λ μ μ€νΈλ¦Ό μ€ κ°μ₯ λ¨Όμ μ²λ¦¬λ μμλ₯Ό 리ν΄νλ€.
toArray
1
Object[] toArray();
toArray
λ©μλλ μ€νΈλ¦Όμ μμλ€μ λ°°μ΄λ‘ λ³ννλ€.
μ€νΈλ¦Όμ μ΅μ’
ν¬κΈ°λ₯Ό 미리 μ μ μκΈ° λλ¬Έμ μ€νΈλ¦Όμ μμλ€μ ArrayList
μ κ°μ΄ ν¬κΈ°λ₯Ό μ‘°μ ν μ μλ 컨ν
μ΄λμ λ΄κ³ , κ°μλ₯Ό κ³μ°νμ¬ λ°°μ΄μ μμ±νκ³ μ»¨ν
μ΄λμ μμλ€μ μλ‘ μμ±λ λ°°μ΄μ 볡μ¬νλ κ³Όμ μ μ§ννλ€.
1
2
3
Stream<String> stream = Stream.of("apple", "banana", "cherry");
Object[] array = stream.toArray();
// [apple, banana, cherry]
match κ³μ΄
1
boolean allMatch(Predicate<? super T> predicate);
allMatch
λ©μλλ μ€νΈλ¦Όμ λͺ¨λ μμκ° μ£Όμ΄μ§ 쑰건 predicate
λ₯Ό λ§μ‘±νλμ§ κ²μ¬νλ μ°μ°μ΄λ€.
쑰건μ λ§μ‘±νμ§ μλ μμλ₯Ό λ°κ²¬νλ μκ° μ¦μ false
λ₯Ό 리ν΄νκ³ λ μ΄μ μμλ₯Ό μ²λ¦¬νμ§ μλλ€. λ§μ½ λΉ μ€νΈλ¦Όμ κ²μ¬νλ κ²½μ° νμ true
λ₯Ό 리ν΄νλ€.
λ¨, 무ν μ€νΈλ¦Όμ κ²½μ° μ‘°κ±΄μ λ§μ‘±νλ μμκ° μλ€λ©΄ μμν μ€νλ μ μλ€.
1
2
3
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean allEven = numbers.stream()
.allMatch(num -> num % 2 == 0) // true
anyMatch
λ νλλΌλ 쑰건μ λ§μ‘±νλ©΄ true
λ₯Ό 리ν΄νλ€. 쑰건μ λ§μ‘±νλ μμλ₯Ό λ°κ²¬νλ μ¦μ κ²μ¬λ₯Ό μ’
λ£νκ³ true
λ₯Ό 리ν΄νλ€.
noneMatch
λ λͺ¨λ μμκ° μ‘°κ±΄μ λ§μ‘±νμ§ μμΌλ©΄ true
λ₯Ό 리ν΄νλ€. 쑰건μ λ§μ‘±νλ μμλ₯Ό λ°κ²¬νλ μ¦μ κ²μ¬λ₯Ό μ’
λ£νκ³ false
λ₯Ό 리ν΄νλ€.