[JAVA] Stream - 2

Coastbyยท2022๋…„ 11์›” 23์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
32/33

์ŠคํŠธ๋ฆผ์˜ ์ค‘๊ฐ„ ์—ฐ์‚ฐ

โ—‹ ์ŠคํŠธ๋ฆผ ์ž๋ฅด๊ธฐ - skip(), limit()

๐Ÿ‘‰ย ์˜ˆ์‹œ

IntStream intStream = IntStream.rangeClosed(1, 10);  //12345678910
intStream.skip(3).limit(5).forEach(System.out::print);

45678

โ—‹ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ - filter(), distinct()

๐Ÿ‘‰ย ์˜ˆ์‹œ

IntStream intStream = IntStream.of(1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7);
intStream.distinct().forEach(System.out::print);

1234567
IntStream intStream = IntStream.rangeClosed(1, 10);
intStream.filter(i -> i%2==0).forEach(System.out::print);

246810

โ—‹ ์ŠคํŠธ๋ฆผ ์ •๋ ฌํ•˜๊ธฐ - sorted()

Comparator๋ฅผ ์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ์ •๋ ฌ (Comparable)๋กœ ์ •๋ ฌ

๋ฌธ์ž์—ด์ŠคํŠธ๋ฆผ ์ •๋ ฌ ๋ฐฉ๋ฒ•

Comparator์˜ comparing()์œผ๋กœ ์ •๋ ฌ ๊ธฐ์ค€์„ ์ œ๊ณต

Comparator์ธํ„ฐํŽ˜์ด์Šค์˜ static ๋ฉ”์„œ๋“œ์ธ comparing()์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ๊ธฐ์ค€์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค

๋น„๊ต ๋Œ€์ƒ์ด ๊ธฐ๋ณธํ˜•์ธ ๊ฒฝ์šฐ, ์•„๋ž˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํ† ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ ๊ณผ์ •์ด ์—†์–ด์„œ ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •๋ ฌ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” themComparing()์„ ์‚ฌ์šฉํ•œ๋‹ค.

comparingInt(ToIntFunction<T> keyExtractor)
comparingLong(ToLongFunction<T> keyExtractor)
comparingDouble(ToDoubleFunction<T> keyExtractor)

๐Ÿ‘‰ย ์˜ˆ์‹œ

ํ•™์ƒ ์ŠคํŠธ๋ฆผ(studentStream)์„ ๋ฐ˜(Ban), ์„ฑ์ (TotalScore), ์ด๋ฆ„(Name) ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ์„œ ์ถœ๋ ฅํ•˜๊ธฐ

studentStream.sorted(Comparator.comparing(Student::getBan)
                .thenComparing(Student::getTotalScore)
                .theComparing(Student::getName))
                .forEach(System.out::println);

โ—‹ ๋ณ€ํ™˜ - map()

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ์— ์ €์žฅ๋œ ๊ฐ’ ์ค‘์—์„œ ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ๋ฝ‘์•„๋‚ด๊ฑฐ๋‚˜ ํŠน์ • ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ T ํƒ€์ž…์„ R ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

Stream<R> map(Function<T, R> mapper)    //Stream<T> -> Stream<R>

๐Ÿ‘‰ย ์˜ˆ์ œ

Stream<String> strStream = Stream.of("1", "2", "3");
strStream.map(Integer::parseInt).filter(x -> x>1).forEach(System.out::print);

23

โ—‹ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ์—ฟ๋ณด๊ธฐ - peek()

์—ฐ์‚ฐ๊ณผ ์—ฐ์‚ฐ ์‚ฌ์ด์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

filter()๋‚˜ map()์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. (๋””๋ฒ„๊น… ์šฉ๋„)

Stream<T> peek(Consumer<T> action)     //์ค‘๊ฐ„ ์—ฐ์‚ฐ (์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ x)
void      forEach(Consumer<T> action)  //์ตœ์ข… ์—ฐ์‚ฐ (์ŠคํŠธ๋ฆผ์„ ์†Œ๋น„ o)

โ—‹ mapToInt(), mapToLong(), mapToDouble()

map()์˜ ์—ฐ์‚ฐ๊ฒฐ๊ณผ๋กœ ์ˆซ์ž์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ Stream๋ณด๋‹ค ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ(IntStream)์œผ๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค.

Stream<String> strStream = Stream.of("1", "2", "3");
IntStream intStream = strStream.mapToInt(Integer::parseInt);

๋ฐ˜๋Œ€๋กœ IntStream์„ Stream๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋Š” mapToObj()๋ฅผ, Stream๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๋Š” boxed()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Stream<String> printStream = intStream.mapToObj(i -> i+", ");
printStream.forEach(System.out::print);

โœ…ย mapToInt()์™€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ
mapToInt (Integer::parseInt) : Stream โ†’ IntStream
mapToInt(Integer::intValue) : Stream โ†’ IntStream

โ—‹ Stream<T[]>๋ฅผ Stream๋กœ ๋ณ€ํ™˜ - flapMap()

์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด์ด๊ฑฐ๋‚˜ map()์˜ ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ (Stream<T[]>), Stream๋กœ ๋‹ค๋ฃจ๊ณ  ์‹ถ์„ ๋•Œ flapMap()์„ ์‚ฌ์šฉํ•œ๋‹ค.

Stream<String[]> strArrStream = Stream.of(
                new String[] {"A", "B", "C"},
                new String[] {"a", "b", "c"});

์œ„์˜ ์ŠคํŠธ๋ฆผ์„ Stream์œผ๋กœ ๋งŒ๋“ ๋‹ค.

Stream<String> strStream = strArrStream.flatMap(Arrays::stream);
strStream.map(String::toLowerCase)
        .forEach(System.out::print);

abcabc
  • ๋‹ค๋ฅธ ์˜ˆ์ œ

profile
ํ›ˆ์ด์•ผ ํ™”์ดํŒ…

0๊ฐœ์˜ ๋Œ“๊ธ€