์๋ฐ์์๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐฐ์ด์ด๋ ์ปฌ๋ ์
(collect Framework)์ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฐ๋ณต๋ฌธ(if while ๋ฑ๋ฑ..)์ด๋ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๋ฒ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ํ์ง๋ง ์ด๋ฐ ์ฝ๋๋ ๊ธธ์ด๊ฐ ๊ธธ๊ณ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ฉฐ, ์ฝ๋์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํจ(๋งค๋ฒ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ๊ณ ์ฝ์ด์ค๊ธฐ ์ํด์๋ ์๋ก์ด ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผ ํจ).
์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ์ ๊ฐ์ด ์ ํํ๋ ์ฒ๋ฆฌ ํจํด์ ๊ฐ์ง์ง ๋ชปํ๊ธฐ์ ๋งค๋ฒ ๋ฐ์ดํฐ๋ง๋ค ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํด์ ์์
์ ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด Java8๋ถํฐ ํจ์ํ ํ๋ก๊ทธ๋จ์ ํน์ฑ์ ๊ฐ์ง stream์ด๋ผ๋ API(๊ฐ์ฒด)๋ฅผ ๋์
ํ๊ฒ ๋์๋ค.
stream API๋ ์ ํ์ ์ธ ๋ฐ์ดํฐ ์ฝ๊ธฐ/์ฐ๊ธฐ์ ํนํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๋ฐ๋ณต๋ ํ๋ก๊ทธ๋จ ์์
์์ด ๋น๊ต์ ์์ํ๊ฒ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋ค. ๋ํ, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ด ์งง๋ค๋ ์ฅ์ ๋ ์๋ค.
Stream API์ ํน์ง
-๋ฐ์ดํฐ์ ์ ๊ทผํด์ ์ฝ๊ธฐ/์ฐ๊ธฐ/์์ ํ๋๋ฐ ์ต์ ํ๋ ๋ฉ์๋ ์ ๊ณตํ๋ค.
-Stream์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ collection๊ณผ ๋ฌ๋ฆฌ ํ ๋ฒ๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. (์ฌ์ฌ์ฉ ๋ถ๊ฐ)
>>b/c ์ต์ข
์ถ๋ ฅํ๊ณ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ผ๊ธฐ ์ํด ๋ค ์ฌ๋ผ์ง(Customer ๋ชจ๋ธ)
-Stream์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
-Stream ์ฐ์ฐ์ filter-map ๊ธฐ๋ฐ์ API๋ฅผ ์ฌ์ฉํ์ฌ lazy์ฐ์ฐ์ ํตํด ์ฑ๋ฅ์ ์ต์ ํํจ
>>์ฌ๊ธฐ์ lazy ์ฐ์ฐ์ด๋, ๋ถํ์ํ ์ฐ์ฐ ์ ํ๋ ๊ฒ์ผ๋ก, ๋ฌด์กฐ๊ฑด ๋ชจ๋ ๊ฒ์ ์ฐ์ฐํ๋ Eager ์ฐ์ฐ๊ณผ ๋ฐ๋ ๊ฐ๋
์ด๋ค.
์๋ฅผ ๋ค๋ฉด, lazy๋ ๋ฐ์ดํฐ A์ ๋ํด์ ์ด๋ฏธ false๊ฐ ๋์์ผ๋ฉด, ๋ค๋ฅธ ์ค๋ณต๋ A ๋ฐ์ดํฐ๋ ๊ณ์ฐ์ ํ์ง ์๋๋ค.
-Stream ์ฐ์ฐ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
Stream API์ ๋์ ํ๋ฆ
1. ๋ฐ์ดํฐ ์์ค๋ฅผ ๊ฐ์ ธ์ด
2. Stream ์์ฑ
์๋ฐ์์ ์ ๊ณตํ๋ ๋ชจ๋ collection framwork์ ์ต์์ ๊ฐ์ฒด๊ฐ Collection ๊ฐ์ฒด์ด๋ค. ์ด Collection ์ธํฐํ์ด์ค์๋ Stream() ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๋ค. ๋ฐ๋ผ์, Collection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ชจ๋ List์ Set collection์์๋ stream() ๋ฉ์๋๋ก ์คํธ๋ฆผ์ ์์ฑํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์์๋ stream์ ์์ฑํ ์ ์๋๋ฐ, ์ด๋๋ Arrays ํด๋์ค๋ฅผ ์ด์ฉํ๋ค. ๋ํ, ๊ธฐ๋ณธํ์
์ธ int, long, doubleํ์ ๋ํ String ์์ฑ์ ์ํ IntStream, LongStream, DoubleStream ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ค.
3. ์ค๊ณ์ฐ์ฐ(ํํฐ-๊ฐ์ ๊ฑธ๋ฌ๋, ๋งต-๊ฐ์ ๋ณํ๋ฅผ ์ค etc..)
stream API์ ์ํด ์์ฑ๋ ์ด๊ธฐ stream์ ์ค๊ณ์ฐ์ฐ์ ํตํด ๋ ๋ค๋ฅธ stream์ผ๋ก ๋ณํ๋๋ค(์ด๋, ์๋ณธ ์คํธ๋ฆผ์ ์ ์ฅ๋๋ค.) ์ด๋ฌํ ์ค๊ณ์ฐ์ฐ์ stream์ ์ ๋ฌ ๋ฐ์ stream์ ๋ณํํ๋ฏ๋ก, ์ค๊ณ ์ฐ์ฐ์ ์ฐ์์ผ๋ก ์ฐ๊ฒฐํด์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. stream์ ์ค๊ณ์ฐ์ฐ์ ํํฐ, ๋งต ๊ธฐ๋ฐ์ API๋ฅผ ์ฌ์ฉํ๊ณ lazy ์ฐ์ฐ์ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ๋ค.
1) ์คํธ๋ฆผ ํํฐ๋ง: filter(), distinct()
2) ์คํธ๋ฆผ ๋ณํ: map(), flatMap()
3) ์คํธ๋ฆผ ์ ํ: limit(), skip()
limit(): ํด๋น ์คํธ๋ฆผ์ ์ฒซ๋ฒ์งธ ์์๋ถํฐ ์ ๋ฌ๋ ๊ฐ์๋งํผ์ ์์๋ง์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ก์ด ์คํธ๋ฆผ์ ๋ฐํ
skip(): ํด๋น ์คํธ๋ฆผ์ ์ฒซ๋ฒ์งธ ์์๋ถํฐ ์ ๋ฌ๋ ๊ฐ์๋งํผ์ ์ ์ธํ ๋๋จธ์ง ์์๋ง์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ก์ด ์คํธ๋ฆผ์ ๋ฐํ
4) ์คํธ๋ฆผ ์ ๋ ฌ: sorted()
5) ์คํธ๋ฆผ ์ฐ์ฐ๊ฒฐ๊ณผ ํ์ธ: peek()
4. ์ต์ข
์ฐ์ฐ
1) ์์์ ์ถ๋ ฅ: forEach()
2) ์์์ ์๋ชจ: reduce()
์ฒซ๋ฒ์งธ์ ๋ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ฐ์ ์ํํ ๋ค, ๊ทธ ๊ฒฐ๊ณผ์ ์ธ ๋ฒ์งธ ์์๋ฅผ ๊ฐ์ง๊ณ ๋๋ค์ ์ฐ์ฐ์ ์ํํ๊ณ , ์์ ์ฐ์ฐํ ๋ด์ฉ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ์ํด (consumer ๊ฐ๋ ๊ณผ ๋น์ท)
3) ์์์ ๊ฒ์: findFirst(), findAny()
๋ ๋ค ์กฐ๊ฑด์ ๋ง๋ ์์๋ฅผ 1๊ฐ๋ฅผ ๋ฆฌํดํ๋ค. ์ง๋ ฌ ์ฒ๋ฆฌํ ๋๋ ๋ ๋ค ๋์ผํ ์์๋ฅผ ๋ฆฌํด ํ์ง๋ง ๋ณ๋ ฌ์ฒ๋ฆฌํ ๋๋ findFirst()๋ ๋ฌด์กฐ๊ฑด ์์ ์๋ ๊ฐ์, findAny()๋ ๋จผ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๊ฐ์ ๋ฆฌํดํจ.
4) ์์์ ๊ฒ์ฌ: anyMatch(), allMatch(), noneMatch()
5) ์์์ ํต๊ณ: count(), min(), mac()
6) ์์์ ์ฐ์ฐ: sum(), average()
7) ์์์ ์์ง: collect()
์คํธ๋ฆผ์ ์์๋ค์ ํฉ์นจ. joining ์ฐ๋ฉด ํฉ์น ๋ ์ฌ์ด์ฌ์ด ๋ญ ๋ค์ด๊ฐ๋์ง ์ค์ ๊ฐ๋ฅ
Stream ์์ฑ ๋ฐฉ๋ฒ
1. List๋ก๋ถํฐ ์คํธ๋ฆผ ์์ฑ
import java.util.stream.Stream;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
//1๋ถํฐ 10๊น์ง ์ ์๋ฅผ ๋ฐ๋ list์์ 6๋ณด๋ค ์๊ณ ์ง์์ธ ์์๋ฅผ ์ฐพ์ 10๋ฐฐ ์ํจ list๋ฅผ ์ถ๋ ฅํ๋ผ.
public class StreamExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
list.stream()
.filter(i -> i<6)
.filter(i -> i%2==0)
.map(i -> i*10)
.collect(Collectors.toList())
.forEach(result -> System.out.println(result + "\t"));
}
}
console
20
40
์์๋ฅผ ๋ณด์๋ฉด
1. ๋จผ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ง๋ค์๋ค.
2. list.stream() : stream์ ์์ฑ
3. filter(i -> i<6) :6๋ณด๋ค ์์ ๊ฐ๋ค์ ๊ฑธ๋ฌ๋ด๋ ํํฐ์ฐ์ฐ
4. filter(i -> i%2 == 0) : 2๋ก ๋๋ด์ ๋ ๋๋จธ์ง๊ฐ 0์ธ(=์ง์) ๊ฐ๋ค๋ง ๊ฑธ๋ฌ๋ด๋ ํํฐ์ฐ์ฐ
5. map(i -> i*10) : ๊ฐ์ 10์ ๊ณฑํ๋ map์ฐ์ฐ
6. collect(Collectors.toList()), forEach: ์์๋ค์ ํฉ์น ๋ค ์ถ๋ ฅํด ๋ด๋ ์ต์ข
์ฐ์ฐ
2. ๋ฆฌ์คํธ ๊ฐ์ฒด๋ก๋ถํฐ ์คํธ๋ฆผ ์์ฑ
import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;
//list์ 1๋ถํฐ 4๊น์ง์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ ฅํ๋ผ.
public class StreamExample {
public static void main(String[] args) {
List<Integer> ll = new ArrayList<>();
ll.add(4);
ll.add(3);
ll.add(2);
ll.add(1);
Stream<Integer> stream = ll.stream();
stream.forEach(System.out::println);
}
}
console
4
3
2
1
3. ๋ฐฐ์ด๋ก๋ถํฐ ์คํธ๋ฆผ ์์ฑ
import java.util.stream.Stream;
import java.util.stream.IntStream;
import java.util.ArrayList;
//1๋ถํฐ 5๊น์ง์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ ์์ฑํ๊ณ ์ถ๋ ฅํ๋ผ.
public class StreamExample {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
IntStream stream2 = Arrays.stream(arr); //๋ฐฐ์ด์ด String ํ์
์ผ๋ก ๋ฐ๊ปด์ ๋ค์ด๊ฐ
stream2.forEach(System.out::println);
}
}
console
1
2
3
4
5
4. ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ก๋ถํฐ ์คํธ๋ฆผ ์์ฑ
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
Stream<Double> stream3 = Stream.of(4.2, 2.5, 3.1, 3.9);
stream3.forEach(System.out::println);
}
}
console
4.2
2.5
3.1
3.9
์ค๊ณ์ฐ์ฐ
1. ์คํธ๋ฆผ ํํฐ๋ง: ์คํธ๋ฆผ์์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ๊ณ , ํ์๋ง ๊ณจ๋ผ๋ด์์ค.
import java.util.stream.Stream;
import java.util.stream.IntStream;
public class StreamExample {
public static void main(String[] args) {
IntStream stream4 = IntStream.of(7, 5, 5, 4, 2, 1, 4, 12, 6, 3);
stream4.distinct()
.filter(n -> n%2 !=0)
.forEach(System.out::println);
}
}
console
7
5
1
3
2. ์คํธ๋ฆผ ๋ณํ: ๋ค์์ ๋ฌธ์์ด๋ค์์ ๊ฐ๊ฐ์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ์์ค.
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
Stream<String> stream5 = Stream.of("Java", "HTML", "CSS", "JavaScript");
stream5.map(s -> s.length())
.forEach(System.out::println);
}
}
console
4
4
3
10
2. ์คํธ๋ฆผ ๋ณํ: ์ฌ๋ฌ ๋ฌธ์์ด์ด ์ ์ฅ๋ ๋ฐฐ์ด์ ๊ฐ ๋ฌธ์์ด์ ํฌํจ๋ ๋จ์ด๋ก ์ด๋ฃจ์ด์ง ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์์ค. (์ค๋ณต๋ ๋จ์ด๋ ์ ๊ฑฐํ์์ค.)
import java.util.stream.Stream;
import java.util.Arrays;
public class StreamExample {
public static void main(String[] args) {
String[] str = {"I study Java", "I will study more", "I am hungry"};
Stream<String> stream6 = Arrays.stream(str);
stream6.flatMap(s -> Stream.of(s.split(" ")))
.distinct()
.forEach(System.out::println);
}
}
console
I
study
Java
will
more
am
hungry
3. ์คํธ๋ฆผ ์ ํ
import java.util.stream.Stream;
import.java.util.stream.IntStream;
public class StreamExample {
public static void main(String[] args) {
IntStream stream7 = IntStream.range(0, 10);
IntStream stream8 = IntStream.range(0, 10);
IntStream stream9 = IntStream.range(0, 10);
stream7.skip(4)
.forEach(n -> System.out.print(n + " "));
System.out.println("\n");
stream8.limit(5)
.forEach(n -> System.out.print(n + " "));
System.out.println("\n");
stream9.limit(7)
.skip(3)
.forEach(n -> System.out.print(n + " "));
}
}
console
4 5 6 7 8 9
0 1 2 3 4
3 4 5 6
4. ์คํธ๋ฆผ ์ ๋ ฌ
import java.util.stream.Stream;
import java.util.Comparator;
public class StreamExample {
public static void main(String[] args) {
//์ค๋ฆ์ฐจ์ Ascending
Stream<String> stream10 = Stream.of("Park", "Kim", "Lee", "Hahm");
stream10.sorted()
.forEach(n -> System.out.print(n + " "));
System.out.println("\n");
//๋ด๋ฆผ์ฐจ์ Descending
/*stream10.sorted(Comparator<T>.reverseOrder())
.forEach(n -> System.out.print(n + " "));
stream์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐํ๋ฏ๋ก ๋ ์ฐ๋ฉด ์๋จ
*/
Stream<String> stream11 = Stream.of("Bread", "Toast", "Sushi", "Cake");
stream11.sorted(Comparator.reverseOrder())
.forEach(n -> System.out.print(n + " "));
}
}
console
Hahm Kim Lee Park
Toast Sushi Cake Bread
์ต์ข
์ฐ์ฐ
1. ์์์ ์๋ชจ: 1๋ถํฐ 10๊น์ง์ ํฉ
import java.util.stream.Stream;
import java.util.Optional;
public class StreamExample {
public static void main(String[] args) {
Stream<Integer> stream12 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = stream12.reduce((x,y) -> x+y);
sum.ifPresent(s -> System.out.println("sum = " + s)); //1+2=3, 1 2 ์ญ์ -> 3+3=6, 3 3 ์ญ์ -> 6+4=10, 6 4 ์ญ์ ...
}
}
console
sum = 55
2. ์์์ ์์ง
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
Stream<String> fruits = Stream.of("banana", "apple", "strawberry");
String result = fruits.map(Object::toString)
.collect(Collectors.joining(", "));
System.out.println(result);
}
}
console
banana, apple, strawberry
*๋ฐ์ดํฐ ํ์
์ด stream์
๋ง์ฝ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ํ์
์ด String์ธ ๋ฐฐ์ดํํ๋ก ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
Stream<String> fruits = Stream.of("banana", "apple", "strawberry");
String result = fruits.map(Object::toString)
.collect(Collectors.toList())
.toString();
System.out.println(result);
}
}
console
[banana, apple, strawberry]
์์ ๋ฌธ์ 1: ์ด๊ฑฐ๋ ๋ฌธ์์ด ์ค์์ a๋ฅผ ํฌํจํ ๋จ์ด๋ฅผ ์ถ๋ ฅํ๋ผ.
๋ฌธ์์ด: aa, ao, oo, bo, ab
์ ๊ทผ ๋ฐฉ๋ฒ: ์ ์๋ ๋ฌธ์์ด ์ค์์ a๊ฐ ํฌํจํ ๋จ์ด๋ฅผ ๊ฑธ๋ฌ๋ด๋ ๊ฒ์ด๋ฏ๋ก filter()์ ์ฌ์ฉํ์
Stream<String> stream = Stream.of("aa", "ao", "oo", "bo", "ab");
System.out.println(stream.filter(n -> n.contains("a"))
.collect(Collectors.joining(", ")));
console
aa, ao, ab
์์ ๋ฌธ์ 2: ์ด๊ฑฐ๋ ๋ฌธ์์ด์ ๋ชจ๋ ๋๋ฌธ์๋ก ๋ฐ๊พธ์์ค.
๋ฌธ์์ด: a, b, c
์ ๊ทผ๋ฐฉ๋ฒ: ๋ฌธ์์ด์ ๋ณํ์์ผ์ผ ํ๋ฏ๋ก map()์ ์ฌ์ฉํ์
Stream<String> stream = Stream.of("a", "b", "c");
stream.map(s -> s.toUpperCase())
.forEach(System.out::println);
console
A
B
C
'๐ฅ๏ธ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Optional ๊ฐ์ฒด : ifPresent(), isPresent(), orElse(), map() (0) | 2023.03.22 |
---|---|
[Java] ๋ถ๋ณ ๊ฐ์ฒด์ Wrapper Class (0) | 2023.03.22 |
[Java] ๋๋ค(Lambda) ํ๊ธฐ๋ฒ (0) | 2023.03.21 |
[Java] ํ์ ์ ๋ณด๋ฅผ ๋ฐ๋ ๊ธฐ๋ณธ ์ฝ๋ (0) | 2023.03.20 |
[Java] ๋ฐฐ์ด: ์์ ์ฝ๋๋ก ๋ฐฐ์ด ์์ฑ, ๋ฐฐ์ด ์์ ๊ฐ์ฒด ์์ฑ, ๋ฐฐ์ด ์ถ๋ ฅํ๋ ๋ฒ ๋ฐฐ์ฐ๊ธฐ (0) | 2023.03.19 |