๐น chap4. ์คํธ๋ฆผ ์๊ฐ
4.1 ์คํธ๋ฆผ์ด๋ ๋ฌด์์ธ๊ฐ?
- ์คํธ๋ฆผ์ ์๋ฐ 8 API์ ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด๋ค.
- ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ์ ์ธํ(์ง์ ํํ)์ผ๋ก ์ปฌ๋ ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ฉํฐ์ค๋ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ์ง ์์๋ ๋ฐ์ดํฐ๋ฅผ ํฌ๋ช ํ๊ฒ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<Dish> lowCaloricDishes = new ArrayList<>();
for(Dish dish: menu) { // ๋์ ์๋ก ์์ ํํฐ๋ง
if(dish.getCalories() < 400) {
lowCaloricDishes.add(dish);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() { // ์ต๋ช
ํด๋์ค๋ก ์๋ฆฌ ์ ๋ ฌ
public int compare(Dish dish1, Dish dish2) {
return Integer.compare(dish1.getCalories(), dish2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish dish: lowCaloricDishes) {
lowCaloricDishesName.add(dish.getName()); // ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉด์ ์๋ฆฌ ์ด๋ฆ ์ ํ
}
์ ์ฝ๋์์๋ lowCaloricDishes๋ผ๋ โ๊ฐ๋น์ง ๋ณ์โ(์ปจํ ์ด๋ ์ญํ ๋ง ํ๋ ์ค๊ฐ ๋ณ์)๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฐ 8์์ ์ด๋ฌํ ์ธ๋ถ ๊ตฌํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ค.
๋ค์์ ์ต์ ์ฝ๋๋ค(์๋ฐ 8)
1
2
3
4
5
6
7
8
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
List<String> lowCaloricDishesName =
**menu.stream()**
.filter(d -> d.getCalories() < 400) // 400์นผ๋ก๋ฆฌ ์ดํ์ ์๋ฆฌ ์ ํ
.sorted(comparing(Dish::getCalories)) // ์นผ๋ก๋ฆฌ๋ก ์๋ฆฌ ์ ๋ ฌ
.map(Dish::getName) // ์๋ฆฌ๋ช
์ถ์ถ
.collect(toList()); // ๋ชจ๋ ์๋ฆฌ๋ช
์ ๋ฆฌ์คํธ์ ์ ์ฅ
stream()์ parallelStream()์ผ๋ก ๋ฐ๊พธ๋ฉด ์ด ์ฝ๋๋ฅผ ๋ฉํฐ์ฝ์ด ์ํคํ ์ฒ์์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๋ค.
1
2
3
4
5
6
List<String> lowCaloricDishesName =
**menu.parallelStream()**
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
๋ฃจํ์ if ์กฐ๊ฑด๋ฌธ ๋ฑ์ ์ ์ด ๋ธ๋ก์ ์ฌ์ฉํด์ ์ด๋ป๊ฒ ๋์์ ๊ตฌํํ ์ง ์ง์ ํ ํ์ ์์ด โ์ ์นผ๋ก๋ฆฌ์ ์๋ฆฌ๋ง ์ ํํ๋ผโ ๊ฐ์ ๋์์ ์ํ์ ์ง์ ํ ์ ์๋ค.
์์ฒ๋ผ filter, sorted, map, collect ๊ฐ์ ์ฌ๋ฌ ๋น๋ฉ ๋ธ๋ก ์ฐ์ฐ์ ์ฐ๊ฒฐํด์ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์๋ค. ์ฐ์ฐ์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฐ๊ฒฐํด๋ ์ฌ์ ํ ๊ฐ๋ ์ฑ๊ณผ ๋ช ํ์ฑ์ด ์ ์ง๋๋ค. ๊ฐ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ ๋ค์ ์ฐ์ฐ์ผ๋ก ์ฐ๊ฒฐ๋๋ค.
filter, sorted, map, collect ๊ฐ์ ์ฐ์ฐ์ ๊ณ ์์ค ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฏ๋ก ํน์ ์ค๋ ๋ฉ ๋ชจ๋ธ์ ์ ํ๋์ง ์๊ณ ์์ ๋กญ๊ฒ ์ด๋ค ์ํฉ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ณ๋ ฌํํ๋ฉด์ ์ค๋ ๋์ ๋ฝ์ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
1
2
Map<Dish.Type, List<Dish>> dishesByType =
menu.stream().collect(groupingBy(Dish::getType));
์ ์ฝ๋๋ Map ๋ด๋ถ์ ํ์์ ๋ฐ๋ผ ์๋ฆฌ๋ฅผ ๊ทธ๋ฃนํํ๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ ์๋ค.
1
2
3
4
5
{
FISH=[prawns,salmon],
OTHER=[french fries, rice, season fruit, pizza],
MEAT=[pork, beef, chicken]
}
ํน์ง
- ์ ์ธํ : ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค.
- ์กฐ๋ฆฝํ ์ ์์ : ์ ์ฐ์ฑ์ด ์ข์์ง๋ค.
- ๋ณ๋ ฌํ : ์ฑ๋ฅ์ด ์ข์์ง๋ค.
1
2
3
4
5
6
7
8
9
10
11
List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT),
new Dish("beef", false, 700, Dish.Type.MEAT),
new Dish("chicken", false, 400, Dish.Type.MEAT),
new Dish("french fries", true, 530, Dish.Type.OTHER),
new Dish("rice", true, 350, Dish.Type.OTHER),
new Dish("season fruit", true, 120, Dish.Type.OTHER),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 300, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH)
);
Dish๋ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ณํ ํด๋์ค๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Dish {
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public boolean isVegetarian() {
return vegetarian;
}
public int getCalories() {
return calories;
}
public Type getType() {
return type;
}
@Override
public String toString() {
return name;
}
public enum Type { MEAT, FISH, OTHER }
}
4.2 ์คํธ๋ฆผ ์์ํ๊ธฐ
์คํธ๋ฆผ : ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฐ์ฐ์ ์ง์ํ๋๋ก ์์ค์์ ์ถ์ถ๋ ์ฐ์๋ ์์
- ์ฐ์๋ ์์
- ์ปฌ๋ ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํธ๋ฆผ์ ํน์ ์์ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ์๋ ๊ฐ ์งํฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
- ์ปฌ๋ ์ ์ ์๋ฃ๊ตฌ์กฐ์ด๋ฏ๋ก (ArrayList๋ฅผ ์ฌ์ฉํ ์ง LiskedList๋ฅผ ์ฌ์ฉํ ์ง) ์๊ฐ๊ณผ ๊ณต๊ฐ์ ๋ณต์ก์ฑ๊ณผ ๊ด๋ จ๋ ์์ ์ ์ฅ ๋ฐ ์ ๊ทผ ์ฐ์ฐ์ด ์ฃผ๋ฅผ ์ด๋ฃฌ๋ค.
- ์คํธ๋ฆผ์ filter, sorted, map์ฒ๋ผ ํํ ๊ณ์ฐ์์ด ์ฃผ๋ฅผ ์ด๋ฃฌ๋ค.
- ์ปฌ๋ ์ ์ ์ฃผ์ : ๋ฐ์ดํฐ / ์คํธ๋ฆผ์ ์ฃผ์ : ๊ณ์ฐ
- ์์ค
- ์ปฌ๋ ์ , ๋ฐฐ์ด, I/O ์์ ๋ฑ์ ๋ฐ์ดํฐ ์ ๊ณต ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์๋น
- ์ ๋ ฌ๋ ์ปฌ๋ ์ ์ผ๋ก ์คํธ๋ฆผ์ ์์ฑํ๋ฉด ์ ๋ ฌ์ด ๊ทธ๋๋ก ์ ์ง๋๋ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฐ์ฐ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ผ๋ฐ์ ์ผ๋ก ์ง์ํ๋ ์ฐ์ฐ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋น์ทํ ์ฐ์ฐ ์ง์
ex) filter, map, reduce, find, match, sort
์์ฐจ์ ๋๋ ๋ณ๋ ฌ์ ์ผ๋ก ์คํํ ์ ์๋ค.
- ํ์ดํ๋ผ์ด๋
- ์คํธ๋ฆผ ์ฐ์ฐ๋ผ๋ฆฌ ์ฐ๊ฒฐํด์ ์ปค๋ค๋ ํ์ดํ ๋ผ์ธ์ ๊ตฌ์ฑํ ์ ์๋๋ก ์คํธ๋ฆผ ์์ ์ ๋ฐํํ๋ค. ๋๋ถ์ ์ต์ ํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ์ฐ์ฐ ํ์ดํ๋ผ์ธ์ ๋ฐ์ดํฐ ์์ค์ ์ ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์์ ๋น์ทํ๋ค.
- ๋ด๋ถ ๋ฐ๋ณต
- ๋ฐ๋ณต์๋ฅผ ์ด์ฉํด์ ๋ช ์์ ์ผ๋ก ๋ฐ๋ณตํ๋ ์ปฌ๋ ์ ๊ณผ ๋ฌ๋ฆฌ ์คํธ๋ฆผ์ ๋ด๋ถ ๋ฐ๋ณต์ ์ง์ํ๋ค.
1
2
3
4
5
6
7
8
import static java.util.stream.Collectors.toList;
List<String> threeHighCaloricDishNames =
menu.stream() // ๋ฉ๋ด(์๋ฆฌ ๋ฆฌ์คํธ)์์ ์คํธ๋ฆผ์ ์ป๋๋ค.
.filter(dish -> dish.getCalories() > 300) // ๊ณ ์นผ๋ก๋ฆฌ ์๋ฆฌ ํํฐ๋ง
.map(Dish::getName) // ์๋ฆฌ๋ช
์ถ์ถ
.limit(3) // ์ ์ฐฉ์ ์ธ ๊ฐ๋ง ์ ํ
.collect(toList()); // ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ๋ฆฌ์คํธ๋ก ์ ์ฅ
System.out.println(threeHighCaloricDishNames); // ๊ฒฐ๊ณผ๋ [pork, beef, chicken]
๋ฐ์ดํฐ ์์ค๋ ์๋ฆฌ ๋ฆฌ์คํธ(๋ฉ๋ด)์ด๋ค.
- filter
- ๋๋ค๋ฅผ ์ธ์๋ก ๋ฐ์ ํน์ ์์๋ฅผ ์ ์ธ์ํจ๋ค.
d โ d.getCalories() > 300
์ด๋ผ๋ ๋๋ค๋ฅผ ์ ๋ฌํด์ 300 ์นผ๋ก๋ฆฌ ์ด์์ ์๋ฆฌ๋ฅผ ์ ํํ๋ค.
- map
- ๋๋ค๋ฅผ ์ด์ฉํด์ ํ ์์๋ฅผ ๋ค๋ฅธ ์์๋ก ๋ณํํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค.
- ๋ฉ์๋ ์ฐธ์กฐ
Dish::getName
(๋๋ค ํํ์์ผ๋ก๋d โ d.getName()
)์ ์ ๋ฌํด์ ๊ฐ๊ฐ์ ์๋ฆฌ๋ช ์ ์ถ์ถํ๋ค.
- limit
- ์ ํด์ง ๊ฐ์ ์ด์์ ์์๊ฐ ์คํธ๋ฆผ์ ์ ์ฅ๋์ง ๋ชปํ๊ฒ ์คํธ๋ฆผ ํฌ๊ธฐ๋ฅผ ์ถ์ truncateํ๋ค.
- collect
- ์คํธ๋ฆผ์ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ๋ค. (ex. ์คํธ๋ฆผ์ ๋ฆฌ์คํธ๋ก ๋ณํ)
- collect๊ฐ ๋ค์ํ ๋ณํ ๋ฐฉ๋ฒ์ ์ธ์๋ก ๋ฐ์ ์คํธ๋ฆผ์ ๋์ ๋ ์์๋ฅผ ํน์ ๊ฒฐ๊ณผ๋ก ๋ณํ์ํค๋ ๊ธฐ๋ฅ์ ์ํํ๋ค.
4.3 ์คํธ๋ฆผ๊ณผ ์ปฌ๋ ์
์ปฌ๋ ์ ๊ณผ ์คํธ๋ฆผ์ ์ฐจ์ด
- ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๋ ๋(์๊ฐ)์ ์ฐจ์ด
์ปฌ๋ ์ : ํ์ฌ ์๋ฃ๊ตฌ์กฐ๊ฐ ํฌํจํ๋ ๋ชจ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
โ ์ปฌ๋ ์ ์ ๋ชจ๋ ์์๋ ์ปฌ๋ ์ ์ ์ถ๊ฐํ๊ธฐ ์ ์ ๊ณ์ฐ๋์ด์ผ ํจ
์คํธ๋ฆผ : ์์ฒญํ ๋๋ง ์์๋ฅผ ๊ณ์ฐํ๋ ๊ณ ์ ๋ ์๋ฃ๊ตฌ์กฐ(์คํธ๋ฆผ์๋ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค)
โ ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ ๊ฐ๋ง ์คํธ๋ฆผ์์ ์ถ์ถํจ
4.3.1 ๋ฑ ํ ๋ฒ๋ง ํ์ํ ์ ์๋ค
๋ฐ๋ณต์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํธ๋ฆผ๋ ํ ๋ฒ๋ง ํ์ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ณต์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ๋ฒ ํ์ํ ์์๋ฅผ ๋ค์ ํ์ํ๋ ค๋ฉด ์ด๊ธฐ ๋ฐ์ดํฐ ์์ค์์ ์๋ก์ด ์คํธ๋ฆผ์ ๋ง๋ค์ด์ผ ํ๋ค. โ ๋ง์ฝ ๋ฐ์ดํฐ ์์ค๊ฐ I/O ์ฑ๋์ด๋ผ๋ฉด ์์ค๋ฅผ ๋ฐ๋ณต ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์๋ก์ด ์คํธ๋ฆผ์ ๋ง๋ค ์ ์๋ค.
1
2
3
4
5
List<String> title = Arrays.asList("Java8", "In", "Action");
Stream<String> s = title.stream();
s.forEach(System.out::println); // title์ ๊ฐ ๋จ์ด๋ฅผ ์ถ๋ ฅ
s.forEach(System.out::println);
// -> java.lang.IllegalStateException: ์คํธ๋ฆผ์ด ์ด๋ฏธ ์๋น๋์๊ฑฐ๋ ๋ซํ
์คํธ๋ฆผ์ ๋จ ํ ๋ฒ๋ง ์๋นํ ์ ์๋ค!
4.3.2 ์ธ๋ถ ๋ฐ๋ณต๊ณผ ๋ด๋ถ ๋ฐ๋ณต
์ปฌ๋ ์ : ์ธ๋ถ ๋ฐ๋ณต, ์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ์ง์ ์์๋ฅผ ๋ฐ๋ณตํด์ผํจ(ex. for-each)
1 2 3 4
List<String> names = new ArrayList<>(); for(Dish dish: menu) { // ๋ฉ๋ด ๋ฆฌ์คํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์์ฐจ ๋ฐ๋ณตํ๋ค. names.add(dish.getName()); // ์ด๋ฆ์ ์ถ์ถํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ค. }
1 2 3 4 5 6
List<String> names = new ArrayList<>(); Iterator<String> iterator = menu.iterator(); while(iterator.hasNext()) { // ๋ช ์์ ๋ฐ๋ณต Dish dish = iterator.next(); names.add(dish.getName()); }
์คํธ๋ฆผ : ๋ด๋ถ ๋ฐ๋ณต, ํจ์์ ์ด๋ค ์์ ์ ์ํํ ์ง๋ง ์ง์ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์์์ ์ฒ๋ฆฌ๋จ
1 2 3
List<String> name = menu.stream() .map(Dish::getName) // map ๋ฉ์๋๋ฅผ getName ๋ฉ์๋๋ก ํ๋ผ๋ฏธํฐํํด์ ์๋ฆฌ๋ช ์ถ์ถ .collect(toList()); // ํ์ดํ๋ผ์ธ์ ์คํํ๋ค. ๋ฐ๋ณต์ ํ์์๋ค.
- ์คํธ๋ฆผ์ ์ด์
- ๋ด๋ถ ๋ฐ๋ณต์ ์ด์ฉํด ์์ ์ ํฌ๋ช ํ๊ฒ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ ์ต์ ํ๋ ๋ค์ํ ์์๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ์ดํฐ ํํ๊ณผ ํ๋์จ์ด๋ฅผ ํ์ฉํ ๋ณ๋ ฌ์ฑ ๊ตฌํ์ ์๋์ผ๋ก ์ ํํ๋ค.
์ปฌ๋ ์ ์ ์ค์ค๋ก ๊ด๋ฆฌํด์ผํ๋ค.(ํฌ๊ธฐํ๋์ง synchronized๋ก ์ฌ์ฉํ๋์ง)
Quiz. ์ธ๋ถ ๋ฐ๋ณต vs ๋ด๋ถ ๋ฐ๋ณต
์คํธ๋ฆผ ๋์์ ์ฌ์ฉํด ๋ค์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํด๋ณด์.
1 2 3 4 5 6 7 8
List<String> highCaloricDishes = new ArrayList<>(); Iterator<String> iterator = menu.iterator(); while(iterator.hasNext()) { Dish dish = iterator.next(); if(dish.getCalories() > 300) { highCaloricDishes.add(d.getName()); } }
์ ๋ต
1 2 3 4 5
List<String> highCaloricDishes = menu.stream() .filter(d -> d.getCalories() > 300) .map(Dish::getName) .collect(toList());
4.4 ์คํธ๋ฆผ ์ฐ์ฐ
1
2
3
4
5
List<String> names = menu.stream() // ์๋ฆฌ ๋ฆฌ์คํธ์์ ์คํธ๋ฆผ ์ป๊ธฐ
.filter(dish -> dish.getCalories() > 300) // ์ค๊ฐ ์ฐ์ฐ
.map(Dish::getName) // ์ค๊ฐ ์ฐ์ฐ
.limit(3) // ์ค๊ฐ ์ฐ์ฐ
.collect(toList()); // ์คํธ๋ฆผ์ ๋ฆฌ์คํธ๋ก ๋ณํ
์ ์์ ์์ ์ฐ์ฐ์ ๋ ๊ทธ๋ฃน์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.
- ์ค๊ฐ ์ฐ์ฐ : filter, map, limit์ ์๋ก ์ฐ๊ฒฐ๋์ด ํ์ดํ๋ผ์ธ์ ํ์ฑ
- ์ต์ข ์ฐ์ฐ : collect๋ก ํ์ดํ๋ผ์ธ์ ์คํํ ๋ค์ ๋ซ๊ธฐ
4.4.1 ์ค๊ฐ ์ฐ์ฐ
filter๋ sorted ๊ฐ์ ์ค๊ฐ ์ฐ์ฐ์ ๋ค๋ฅธ ์คํธ๋ฆผ์ ๋ฐํํ๋ค. ์ค๊ฐ ์ฐ์ฐ์ ํน์ง์ ๋จ๋ง ์ฐ์ฐ์ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์คํํ๊ธฐ ์ ๊น์ง๋ ์๋ฌด ์ฐ์ฐ๋ ์ํํ์ง ์๋๋ค๋ ๊ฒ, ์ฆ ๊ฒ์ผ๋ฅด๋ค๋ ๊ฒ์ด๋ค. ์ค๊ฐ ์ฐ์ฐ์ ํฉ์น ๋ค์์ ํฉ์ณ์ง ์ค๊ฐ ์ฐ์ฐ์ ์ต์ข ์ฐ์ฐ์ผ๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
List<String> names =
menu.stream()
.filter(dish -> {
System.out.println("filtering:" + dish.getName());
return dish.getCalories() > 300;
}) // ํํฐ๋งํ ์๋ฆฌ๋ช
์ ์ถ๋ ฅํ๋ค
.map(dish -> {
System.out.println("mapping:" + dish.getName());
return dish.getName();
}) // ์ถ์ถํ ์๋ฆฌ๋ช
์ ์ถ๋ ฅํ๋ค
.limit(3)
.collect(toList());
System.out.println(names);
1
2
3
4
5
6
7
filtering:pork
mapping:pork
filtering:beef
mapping:beef
filtering:chicken
mapping:chicken
[pork, beef, chicken]
์คํธ๋ฆผ์ ๊ฒ์ผ๋ฅธ(lazy) ํน์ฑ ๋๋ฌธ์ ๋ช ๊ฐ์ง ์ต์ ํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค.
300 ์นผ๋ก๋ฆฌ๊ฐ ๋๋ ์๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง๋ง ์ค์ง ์ฒ์ 3๊ฐ๋ง ์ ํ๋์๋ค.
โ ์ด๋ limit ์ฐ์ฐ ๊ทธ๋ฆฌ๊ณ ์ผํธ์ํท์ด๋ผ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฒ ๋๋ถ์ด๋ค.
filter์ map์ ์๋ก ๋ค๋ฅธ ์ฐ์ฐ์ด์ง๋ง ํ ๊ณผ์ ์ผ๋ก ๋ณํฉ๋์๋ค.
โ ์ด ๊ธฐ๋ฒ์ ๋ฃจํ ํจ์ ์ด๋ผ๊ณ ํ๋ค.
4.4.2 ์ต์ข ์ฐ์ฐ
์ต์ข ์ฐ์ฐ์ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ค. ๋ณดํต ์ต์ข ์ฐ์ฐ์ ์ํด List, Integer, void ๋ฑ ์คํธ๋ฆผ ์ด์ธ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค.
๋ค์์ void ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค.
1
menu.stream().forEach(System.out::println);
Quiz. ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ
๋ค์ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ์ ๊ตฌ๋ณํ์์ค.
1 2 3 4 5
long count = menu.stream() .filter(d -> d.getCalories() > 300) .distinct() .limit(3) .count();
์ ๋ต
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง ์ฐ์ฐ count๋ ์คํธ๋ฆผ์ด ์๋ long์ ๋ฐํํ๋ค. ๋ฐ๋ผ์ count๋ ์ต์ข ์ฐ์ฐ์ด๋ค. filter, distinct, limit๋ ์คํธ๋ฆผ์ ๋ฐํํ๋ฉฐ ์๋ก ์ฐ๊ฒฐํ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ค์ ์ค๊ฐ ์ฐ์ฐ์ด๋ค.
4.4.3 ์คํธ๋ฆผ ์ด์ฉํ๊ธฐ
์คํธ๋ฆผ์ ์ด์ฉ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ง์๋ฅผ ์ํํ (์ปฌ๋ ์ ๊ฐ์) ๋ฐ์ดํฐ ์์ค
- ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ ์ค๊ฐ ์ฐ์ฐ ์ฐ๊ฒฐ
- ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค ์ต์ข ์ฐ์ฐ
[ ์ค๊ฐ ์ฐ์ฐ ]
์ฐ์ฐ | ํ์ | ๋ฐํ ํ์ | ์ฐ์ฐ์ ์ธ์ | ํจ์ ๋์คํฌ๋ฆฝํฐ |
---|---|---|---|---|
filter | ์ค๊ฐ ์ฐ์ฐ | Stream | Predicate | T โ boolean |
map | ์ค๊ฐ ์ฐ์ฐ | Stream | Function<T, R> | T โ R |
limit | ์ค๊ฐ ์ฐ์ฐ | Stream | ย | ย |
sorted | ์ค๊ฐ ์ฐ์ฐ | Stream | Comparator | (T, T) โ int |
distinct | ์ค๊ฐ ์ฐ์ฐ | Stream | ย | ย |
[ ์ต์ข ์ฐ์ฐ ]
์ฐ์ฐ | ํ์ | ๋ฐํ ํ์ | ๋ชฉ์ |
---|---|---|---|
forEach | ์ต์ข ์ฐ์ฐ | void | ์คํธ๋ฆผ์ ๊ฐ ์์๋ฅผ ์๋นํ๋ฉด์ ๋๋ค๋ฅผ ์ ์ฉํ๋ค. |
count | ์ต์ข ์ฐ์ฐ | long(generic) | ์คํธ๋ฆผ์ ์์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค. |
collect | ์ต์ข ์ฐ์ฐ | ย | ์คํธ๋ฆผ์ ๋ฆฌ๋์คํด์ ๋ฆฌ์คํธ, ๋งต, ์ ์ ํ์์ ์ปฌ๋ ์ ์ ๋ง๋ ๋ค. |