๐ Stream์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๋ค๋ฃจ๋ API
- ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฒ๋ฆฌํ๋ ํ๋ฆ์ ์ ๊ณต
- ํ ๋ฒ ์ฌ์ฉํ๋ฉด ๋ค์ ์ฌ์ฉํ ์ ์์ (์๋ชจ์ฑ, ์ผํ์ฑ)
List
,Set
,Map
,Array
๋ฑ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ฌ์ฉ ๊ฐ๋ฅ
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 1. ์คํธ๋ฆผ ์์ฑ โ 2. ์ค๊ฐ ์ฐ์ฐ(filter, map ๋ฑ) โ 3. ์ต์ข
์ฐ์ฐ(collect, forEach ๋ฑ)
List<String> result = list.stream()
.filter(s -> s.startsWith("b")) // 'b'๋ก ์์ํ๋ ์์๋ง ์ ํ
.map(String::toUpperCase) // ๋๋ฌธ์๋ก ๋ณํ
.sorted() // ์ ๋ ฌ
.collect(Collectors.toList()); // ๋ฆฌ์คํธ๋ก ๋ณํ
System.out.println(result); // ์ถ๋ ฅ: [BANANA]
1. ์ปฌ๋ ์ (List, Set)์์ ์คํธ๋ฆผ์ผ๋ก ๋ณํ
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> stream = numbers.stream(); // ์ผ๋ฐ ์คํธ๋ฆผ
2. ๋ฐฐ์ด์์ ์คํธ๋ฆผ์ผ๋ก ๋ณํ
String[] arr = {"A", "B", "C"}; Stream<String> stream = Arrays.stream(arr);
3. Stream.of() ๋ก ์์ฑ
Stream<String> stream = Stream.of("a", "b", "c");
4. ์ซ์ํ ์คํธ๋ฆผ(IntStream, LongStream, DoubleStream)
IntStream intStream = IntStream.range(1, 6); // 1~5
5. ๋น ์คํธ๋ฆผ ์์ฑ
Stream<String> emptyStream = Stream.empty();
โ 1)
filter(Predicate<T\>)
- ์กฐ๊ฑด์ ๋ง๋ ์์๋ง ํํฐ๋งPredicate<T> ํจ์ํ ์ธํฐํ์ด์ค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ฐธ๊ฑฐ์ง์ผ๋ก ๋ฆฌํดํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง
List<String> list = Arrays.asList("apple", "banana", "cherry", "blueberry"); List<String> filteredList = list.stream() .filter(s -> s.startsWith("b")) .collect(Collectors.toList()); System.out.println(filteredList); // ์ถ๋ ฅ: [banana, blueberry]
โ 2)
map(Function<T, R>)
- ์์ ๋ณํFunction<T, R> ํจ์ํ ์ธํฐํ์ด์ค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์กฐ๊ฑด์ ๋ง๊ฒ ๋ณํํ ๋ณํ๋ ๊ฐ์ ๋ฆฌํดํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง
List<String> names = Arrays.asList("john", "peter", "anna"); List<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseNames); // ์ถ๋ ฅ: [JOHN, PETER, ANNA]
โ 3)
sorted()
- ์ ๋ ฌList<Integer> numbers = Arrays.asList(5, 2, 9, 1, 3); List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNumbers); // ์ถ๋ ฅ: [1, 2, 3, 5, 9]
โ 4)
distinct()
- ์ค๋ณต ์ ๊ฑฐList<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4); List<Integer> distinctNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); System.out.println(distinctNumbers); // ์ถ๋ ฅ: [1, 2, 3, 4]
โ 5)
limit(n)
,skip(n)
- ๊ฐ์ ์ ํ ๋ฐ ๊ฑด๋๋ฐ๊ธฐList<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50); List<Integer> limitedNumbers = numbers.stream() .limit(3) // ์ฒ์ 3๊ฐ๋ง ์ ํ .collect(Collectors.toList()); List<Integer> skippedNumbers = numbers.stream() .skip(2) // ์ฒ์ 2๊ฐ ๊ฑด๋๋ฐ๊ธฐ .collect(Collectors.toList()); System.out.println(limitedNumbers); // ์ถ๋ ฅ: [10, 20, 30] System.out.println(skippedNumbers); // ์ถ๋ ฅ: [30, 40, 50]
โ 1) collect(Collectors.toList()) - ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ๋ณํ
List<String> result = list.stream() .filter(s -> s.length() > 3) .collect(Collectors.toList());
โ 2) forEach() - ๋ชจ๋ ์์ ์ถ๋ ฅ
list.stream().forEach(System.out::println);
โ 3) count() - ์์ ๊ฐ์ ๋ฐํ
long count = list.stream().count();
โ 4) anyMatch(), allMatch(), noneMatch() - ์กฐ๊ฑด ๊ฒ์ฌ
boolean hasApple = list.stream().anyMatch(s -> s.equals("apple")); // ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด true boolean allStartWithA = list.stream().allMatch(s -> s.startsWith("a")); // ๋ชจ๋ ๋ง์กฑํ๋ฉด true boolean noneStartWithZ = list.stream().noneMatch(s -> s.startsWith("z")); // ํ๋๋ ๋ง์กฑํ์ง ์์ผ๋ฉด true
โ 5) reduce() - ๋์ ์ฐ์ฐ
int sum = numbers.stream().reduce(0, Integer::sum); // ๋ชจ๋ ์ซ์ ๋ํ๊ธฐ System.out.println(sum); // ์ถ๋ ฅ: ํฉ๊ณ ๊ฐ
::
(๋ฉ์๋ ์ฐธ์กฐ) ์ฐ์ฐ์ ์ค๋ช
public List<CourseInfoDto> getCourseDayOfWeek(DayOfWeek dayOfWeek) { // TODO: ๊ณผ์ ๊ตฌํ ๋ถ๋ถ List<Course> courses = courseRepository.getCourseDayOfWeek(dayOfWeek); return courses.stream().map(CourseInfoDto::new).toList(); }
1. ๊ธฐ๋ณธ ๊ฐ๋
- Stream<Integer>: Stream<T>์ ์ ๋ค๋ฆญ ๋ฒ์ ์ผ๋ก,
Integer
๊ฐ์ฒด๋ฅผ ์์๋ก ๊ฐ์ง๋ ์คํธ๋ฆผ.- IntStream:
๊ธฐ๋ณธํ int
๊ฐ์ ๋ค๋ฃจ๋ ํน์ํ ์คํธ๋ฆผ.
3. ์ฌ์ฉ๋ฒ ์ฐจ์ด
Stream<Integer>
- Integer ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ฏ๋ก Stream<Integer>์์ ์ ๊ณตํ๋ ์ผ๋ฐ์ ์ธ Stream ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์.
- ํ์ง๋ง
sum()
,average()
๊ฐ์ ์ซ์ ์ฐ์ฐ์ ํ๋ ค๋ฉดmapToInt()
๋ฑ์ ์ฌ์ฉํ์ฌ IntStream์ผ๋ก ๋ณํํด์ผ ํจ.Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); int sum = integerStream.mapToInt(Integer::intValue).sum(); // IntStream์ผ๋ก ๋ณํ ํ ํฉ๊ณ ๊ณ์ฐ System.out.println(sum); // 15
IntStream
sum()
,average()
,max()
,min()
๊ฐ์ ์ซ์ ์ฐ์ฐ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ ๊ณตํจ.boxed()
๋ฅผ ์ฌ์ฉํ๋ฉด Stream<Integer>๋ก ๋ณํํ ์ ์์.IntStream intStream = IntStream.of(1, 2, 3, 4, 5); int sum = intStream.sum(); // ๋ฐ๋ก ํฉ๊ณ ๊ณ์ฐ ๊ฐ๋ฅ System.out.println(sum); // 15
4. ์์ฑ ๋ฐฉ์
Stream<Integer>
์์ฑStream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
IntStream
์์ฑIntStream intStream1 = IntStream.of(1, 2, 3, 4, 5); IntStream intStream2 = IntStream.range(1, 6); // 1๋ถํฐ 5๊น์ง (6์ ํฌํจ๋์ง ์์) IntStream intStream3 = IntStream.rangeClosed(1, 5); // 1๋ถํฐ 5๊น์ง ํฌํจ
5. ๋ณํ ๋ฐฉ๋ฒ
Stream<Integer> โ IntStream
Stream<Integer> integerStream = Stream.of(1, 2, 3); IntStream intStream = integerStream.mapToInt(Integer::intValue);
IntStream โ Stream<Integer>
IntStream intStream2 = IntStream.of(1, 2, 3); Stream<Integer> boxedStream = intStream2.boxed();