๋ฐฐ์ด
, ์ปฌ๋ ์
๋์์ผ๋ก ์ฐ์ฐ์ ์ํ
์ปฌ๋ ์ ์ ๊ธฐ๋ณธ์ผ๋ก stream()์ ํธ์ถํ ์ ์๋ค.
๋ฐฐ์ด์ Arrays ์ด์ฉ!
์ผ๊ด์ฑ ์๋ ์ฐ์ฐ์ผ๋ก ์๋ฃ์ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ํ๋ค.
์๋ฃ ์ฒ๋ฆฌ์ ๋ํ ์ถ์ํ๊ฐ ๊ตฌํ๋์๋ค๊ณ ํ๋ค.
ํ๋ฒ ์์ฑํ๊ณ ์ฌ์ฉํ ์คํธ๋ฆผ์ ์ฌ์ฌ์ฉ ํ ์ ์์
์คํธ๋ฆผ ์ฐ์ฐ์ ๊ธฐ์กด ์๋ฃ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์๋ฃ์ ๋ํ ์คํธ๋ฆผ์ ์์ฑํ๋ฉด ์คํธ๋ฆผ์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณ๋๋ก ์์ฑ
๋๋ฏ๋ก
์ฐ์ฐ์ด ์ํ๋๋ ๊ธฐ์กด ์๋ฃ์ ๋ํ ๋ณ๊ฒฝ์ ๋ฐ์ํ์ง ์๋๋ค.
์คํธ๋ฆผ ์ฐ์ฐ์ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
์ค๊ฐ ์ฐ์ฐ์ ์ฌ๋ฌ ๊ฐ์ ์ฐ์ฐ์ด ์ ์ฉ๋ ์ ์์ง๋ง,
๋ง์ง๋ง ์ฐ์ฐ์ ๋จ ํ๋๋ง ์ ์ฉํ ์ ์๋ค.
์ต์ข
์ฐ์ฐ์ด ํธ์ถ๋์ด์ผ ์ค๊ฐ ์ฐ์ฐ์ ๋ํ ์ํ์ด ์ด๋ฃจ์ด ์ง๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๋ค.
์ด๋ฐ ์ฐ์ฐ์ ์ง์ฐ ์ฐ์ฐ์ด๋ผ๊ณ ํ๋๋ฐ,
lazy init๋ ํ์์ ํธ์ถ์ ์ํด ์ด๊ธฐํ ๋๋ ๊ฒ ์ฒ๋ผ
์คํธ๋ฆผ๋ ๋ง์ง๋ง ์ฐ์ฐ์ ์ค๊ฐ ์ฐ์ฐ์ ํธ์ถํ๋ lazy ์ฐ์ฐ์ด๋ค.
๋ง์ง๋ง ์ฐ์ฐ์ ํ์ง ์์ผ๋ฉด ์ค๊ฐ ์ฐ์ฐ์ ์ํ๋์ง ์๋๋ค.
int๋ฐฐ์ด์ IntStream์ผ๋ก ๋ณ๊ฒฝ ํด๋ณด๋ ์์
int[] arr = {1, 2, 3, 4, 5};
for (int num : arr) {
System.out.println(num);
}
// ์ถ๋ ฅ
// 1
// 2
// 3
// 4
// 5
IntStream is = Arrays.stream(arr);
is.forEach(System.out::println); // is๊ฐ ์ฌ๊ธฐ์ ์๋ชจ๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ ๋ถ๊ฐ
// ์ถ๋ ฅ
// 1
// 2
// 3
// 4
// 5
Arrays.stream(int[] arr)
๋ IntStream
์ ๋ฐํํ๋ค.
foreach()
๋ Consumer ์ธํฐํ์ด์ค๋ฅผ ์ธ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ์, ๋ฐํ๊ฐ์ด ์๋ค.
( void Consumer<T>
)
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ System.out::println
์ ์์ฑํด์ฃผ๋ฉด
foreach()
๋ก ๊ฐ์ด ๋ค์ด์ฌ๋ ๋ง๋ค ๋ฐ๋ก ์ถ๋ ฅํ๋ค.
์ฐธ๊ณ ๋ก System.out::println
์
Consumer ์ธํฐํ์ด์ค ๊ตฌํ์ ๋๋ค์์ผ๋ก ํํํ n -> System.out.println(n)
์
๋ฉ์๋ ์ฐธ์กฐํ ๋ฌธ๋ฒ์ผ๋ก ๋ณํํ ํํ์ด๋ค.
Arrays.stream(arr).forEach(System.out::println);
๋ณดํต ์ด๋ฐ ํํ๋ก ์ฐ์ธ๋ค.
์ ์ฐ์ด๋ ์ค๊ฐ์ฐ์ฐ์ ๋ช๊ฐ๋ง ์ดํด๋ณด๊ณ ๋์ด๊ฐ๋ค.
์ค๊ฐ ์ฐ์ฐ์๋ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ stream ์ฌ์ฉ์ ctrl + space
์ ๋์์ ๋ฐ์
๊ทธ๋ ๊ทธ๋ ํ์ํ ์ฐ์ฐ์๋ฅผ ๊ณจ๋ผ์ ์ฌ์ฉํ ์ค ์๋ ๊ฒ๋ ํ์ํ๋ค๊ณ ๋ฐฐ์!
filter๋ ๋งค๊ฐ๋ณ์๋ก Predicate<T, boolean>
์ ๋ฐ๋๋ค.
Predicate๋ T๋ฅผ ๋ฐ์์ boolean์ ๋ฐํํ๋ ํจ์ํ ์ธํฐํ์ด์ค!
private static long count(int[] arr) {
// 2๋ณด๋ค ํฐ ์๋ง ์นด์ดํธ
// boolean filter(Predicate<T>)
return Arrays.stream(arr)
.filter(n -> n > 2)
.count();
}
map์ ๋งค๊ฐ๋ณ์๋ก UnaryOperator<T>
๋ฅผ ๋ฐ๋๋ค.
UnaryOperator๋ T๋ฅผ ๋ฐ์์ T๋ฅผ ๋ฐํํ๋ ํจ์ํ ํด๋์ค!
private static long sum2(int[] arr) {
// map์ผ๋ก ๋ฐฐ์ด ์์๋ค ๊ฐ๊ฐ์ 2๋ฅผ ๊ณฑํด์ ๋ฐํ ํ sum() ์ฐ์ฐ
// T map(UnaryOperator<T>) ์คํธ ํฐ๋งต
return Arrays.stream(arr)
.map(n -> n * 2)
.sum();
}
๊ธฐ๋ณธ ์๋ฃํ์ ๊ทธ์ ํด๋นํ๋ wrapper ํด๋์ค๋ก ๋ณํํ๋ ์ญํ
IntStream intStream = IntStream.range(1, 5);
Stream<Integer> integerStream = intStream.boxed();
๊ธฐ๋ณธ์๋ฃํ ๋ฐฐ์ด๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด
์ธ์ ์์ด ์ฌ์ฉํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก๋ง ์ ๋ ฌํ ์ ์๋ค.
IntStream sorted();
wrapper ํด๋์ค ๋ฐฐ์ด๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค๋ฉด
Comparator๋ฅผ ๊ตฌํํ์ฌ ์ฌ์ฉ์ ์ ์ ์ค๋ฆ์ฐจ์ ๊ตฌํ์ด ๊ฐ๋ฅํด์ง๋ค.
Stream<T> sorted( Comparator<? super T> comparator )
ArrayList<String>
์ stream์ผ๋ก ๋ณํํด์ ์ถ๋ ฅํ๊ธฐ 1
List<String> list = new ArrayList<>();
list.add("๋ฝ๋ก๋ก");
list.add("๋ฃจํผ");
list.add("์๋");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
// ๋ฝ๋ก๋ก
// ๋ฃจํผ
// ์๋
ArrayList<String>
์ stream์ผ๋ก ๋ณํํด์ ์ถ๋ ฅํ๊ธฐ 2
List<String> list = new ArrayList<>();
list.add("๋ฝ๋ก๋ก");
list.add("๋ฃจํผ");
list.add("์๋");
Stream<String> stream = list.stream();
stream.sorted().forEach(System.out::println);
// ๋ฃจํผ
// ๋ฝ๋ก๋ก
// ์๋
private static void print3(List<String> list) {
Stream<String> stream = list.stream();
stream.map(s -> s.length())
.forEach(System.out::println);
}
// 3
// 2
// 2
private static void print3(List<String> list) {
Stream<String> stream = list.stream();
stream.filter(s -> s.length() > 2)
.forEach(System.out::println);
}
// ๋ฝ๋ก๋ก
reduce๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ์ฐ ์ํ์ ๋ํ ๊ตฌํ์ ํ ์ ์๋ค.
์ค, reduce ์ ์ฐ๋ฉด ์ด๊ฑธ๋ก ์ ๋งํ๊ฑด ์ ๋ถ ํด๊ฒฐ ํ ์ ์์์ง๋...!!
BiFunction<U, ? super String, U>
public interface BiFunction<T, U, R> {
R apply(T, U);
}
๊ฐ๋จํ ์ฌ์ฉ ์์
BiFunction<Integer, Integer, String> sum = (a, b) -> String.valueOf(a + b);
System.out.println( sum.apply(2, 3) ); // 5
BinaryOperator<String>
BiFunction<T, T, T>
์ ํน์ํ ํํ๋ก ๋ง๋ค์ด์ง ์ธํฐํ์ด์ค์ด๋ค.
public interface BinaryOperator<T> extends BiFunction<T, T, T> {
@Override
T apply(T, T);
}
๊ฐ๋จํ ์ฌ์ฉ ์์
BinaryOperator<String> bo = (s, s2) -> s.length() >= s2.length() ? s : s2;
System.out.println( bo.apply(str1, str2) );
public class reduceStudy {
public static void main(String[] args) {
String[] arr = {"์๋
ํ์ธ์!", "Hi!", "Hi~~~", "Hello!", "Hello~~~", "์๋
ํ์ธ์ ^^"};
System.out.println( print(arr) );
}
private static String print(String[] arr) {
return Arrays
.stream( arr )
.reduce(
"์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ",
(s1, s2) -> s1.length() >= s2.length() ? s1 : s2
);
}
}
print()์์ ์ฌ์ฉ ๋ reduce()๋ฅผ ๋ณด๋ฉด , ๋งค๊ฐ๋ณ์๋ฅผ 2๊ฐ ๋๊ฒจ์ฃผ๊ณ ์๋๋ฐ,
์ฒซ๋ฒ์งธ๋ก ๋์ด๊ฐ ๊ฐ์ U u
ํ์
์ด๊ณ , ๋๋ฒ์งธ๋ก ๋์ด๊ฐ ๊ฐ์ T BinaryOperator<T>
ํ์
์ด๋ค.
๋๋ฒ์งธ๋ก ๋์ด๊ฐ ๊ฐ์ด
์ฒซ๋ฒ์งธ๋ก ๋์ด๊ฐ ๊ฐ ๋ณด๋ค ๊ธธ์ด๊ฐ ๊ธธ์ด์ผ ๋ฐํ๋๋ค.
์ฒซ๋ฒ์งธ๋ก ๋์ด๊ฐ ๊ฐ ๋ณด๋ค ๊ธธ์ด๊ฐ ์งง์ผ๋ฉด ์ฒซ๋ฒ์งธ ์ธ์๊ฐ ๋ฐํ๋๋ค.
๊ทธ๋์ ์์ ์์ ๊ฒฐ๊ณผ๋ ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ์ด๊ธฐ๊ฐ
์ด๋ค.