์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[์ŠคํŠธ๋ฆผ ์ข…๋ฅ˜์™€ ๊ฐ์ฒด ์ƒ์„ฑ]

์ž๋ฐ”

by esoesmio 2023. 4. 12. 15:17

๋ณธ๋ฌธ

๐Ÿค” ์ŠคํŠธ๋ฆผ ๊ฐ์ฒด๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•ด์•ผํ• ๊นŒ์š”?

์ด์ „ ์‹œ๊ฐ„์—๋Š” ์ŠคํŠธ๋ฆผ์ด ์–ด๋– ํ•œ ๊ธฐ์ˆ ์ด๊ณ  ์–ด๋– ํ•œ ๋•Œ์— ์“ฐ์ด๋ฉฐ ์–ด๋–ค ๋ฐฉ์‹๊ณผ ๊ณผ์ •์„ ๊ฑฐ์ณ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค!
์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ด๋Ÿฌํ•œ "์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•" ์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๋ฐฐ์—ด์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ! Arrays.stream()

String[] arr = new String[] {"tomato", "banana", "watermelon"};
Stream<String> streamWasArray = Arrays.stream(arr);
Stream<String> streamWasArray2 = Arrays.stream(arr, 1, 2);
streamWasArray : "tomato", "banana", "watermelon"
streamWasArray2 : "banana", "watermelon"

Arrays ํด๋ž˜์Šค์˜ stream ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š”๋ฐ์š”.
๋‹ค์Œ๊ณผ๊ฐ™์€ ๋‘๊ฐ€์ง€ ์‚ฌ์šฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค!

  • Arrays.stream(T[] arr);๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • Arrays.stream(T[] arr, int startInclusive, int endExclusive);๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์˜จ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ startInclusive ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ endExclusive ์ธ๋ฑ์Šค๊นŒ์ง€๋งŒ์„ ์ถ”์ถœํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ! Collection.stream()

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream(); //stream : "a", "b", "c"

์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. Collection ์— ๋‚ด์žฅ๋œ stream ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

ํ…… ๋นˆ ์ŠคํŠธ๋ฆผ์€ ์“ฐ๊ณ ์‹ถ์€๋ฐ Null์€ ์‹ซ๋‹ค๋ฉด? Empty Stream

public Stream<T> streamOf(List<T> list) {
	if(list == null || list.isEmpty()) return Stream.empty(); // stream : 
	else return list.stream();
}

๋‹ค์Œ๊ณผ๊ฐ™์€ ์ƒํ™ฉ์—์„œ, null ์„ ๋ฐ˜ํ™˜ํ• ๊ฒฝ์šฐ, NullPointerException ๊ฐ™์€ ์—ญ๊ฒจ์šด๊ฒƒ๋“ค์„ ๋งŒ๋‚ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ! ๊ทธ๋ž˜์„œ Stream ์—์„  Stream.empty() ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋นˆ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๊ธฐ๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์„ ์ง์ ‘ ์ŠคํŠธ๋ฆผ์— ๋„ฃ์–ด๋ณด์ž! Stream.builder()

Stream<String> builderStream = Stream.<String>builder()
	.add("java").add("python").add("c++").add("html is not programming lang")
    .build(); // builderStream : "java", "python", "c++", "html is not programming lang"

html ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค
Stream ์€ builder ํŒจํ„ด์„ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๊ฐ€์•„๋‹Œ ํ•จ์ˆ˜๋กœ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด๋ณด์ž! Stream.generate()

Stream<String> generateStream = Stream.generate(() -> "looooop").limit(5)
//generateStream : "looooop", "looooop", "looooop", "looooop", "looooop"

generate ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Supplier<T> ๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๋žŒ๋‹ค๋กœ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋žŒ๋‹ค์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด Stream ์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค!
๋‹ค๋งŒ, generate ํ•จ์ˆ˜๋กœ๋Š” ์ธ์ž๋ฅผ ๋ช‡๊ฐœ ๋„ฃ์„๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, generate() ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” stream ์—  limit ํ•จ์ˆ˜๋กœ ๋žŒ๋‹ค์‹์„ ์ด ๋ช‡๋ฒˆ ์‹คํ–‰์‹œ์ผœ ์ธ์ž๋กœ ๋„ฃ์„๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•˜์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค!

ํŒŒ์ด์ฌ์˜ range ๊ฐ€ ๊ทธ๋ฆฌ ํŽธํ•˜๋‹ค๋ฉด์„œ์š”? Stream.iterate()

Stream<Integer> iteratedStream = Stream.iterate(10, n -> n - 2).limit(5);
//iteratedStream = 10, 8, 6, 4, 2

list(range(10,20,2)).stream()
stream.iterate ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ๊ฐ’๊ณผ, ์ด์ „ ์ธ์ž๊ฐ’์„ ํ†ตํ•ด ์ŠคํŠธ๋ฆผ์— ๋“ค์–ด๊ฐˆ ์š”์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์ฆ‰ ์ดˆ๊ธฐ๊ฐ’์ด n์ผ๋•Œ,

  • n์„ ๋จผ์ € stream ์— ๋„ฃ๊ณ 
  • n ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•œ ๋žŒ๋‹ค์‹์„ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ฐ˜ํ™˜๋œ ๊ฐ’(n1) ์„ stream ์— ๋„ฃ๊ณ 
  • n1 ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•œ ๋žŒ๋‹ค์‹์„ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๋ฐ˜ํ™˜๋œ ๊ฐ’(n2) ์„ stream ์— ๋„ฃ๊ณ ...
  • ์ด๋ฅผ limit ํ•จ์ˆ˜์— ๋ช…์‹œ๋œ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค

๋ผ๋Š” ๋กœ์ง์œผ๋กœ ์‹คํ–‰๋˜๋Š”๊ฒƒ์ด์ฃ !

Stream ํด๋ž˜์Šค๋งŒ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹ˆ๋‹ค? ๊ธฐ๋ณธํƒ€์ž… ์ŠคํŠธ๋ฆผ๋“ค!

Stream<Integer> ๋‚˜ Stream<String> ๊ฐ™์ด ์ œ๋„ˆ๋ฆญ์„ ์ž˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ธฐ๋ณธํƒ€์ž…๋˜ํ•œ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธํƒ€์ž…์— ๋Œ€ํ•œ ๋”์šฑ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜๋Š” ๋˜๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค!

  • IntStream, LongStream์ •์ˆ˜ํƒ€์ž… ์ธ์ž๋ฅผ ๋ฐ›๋Š” ์ด ๋‘ ์ŠคํŠธ๋ฆผ์€ range ์™€ rangeClosed ๋ผ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค!
	IntStream intStream = IntStream.range(1, 7); //intStream = 1, 2, 3, 4, 5, 6
	LongStream longStream = LongStream.rangeClosed(1, 7); //longStream = 1, 2, 3, 4, 5, 6, 7

range : ์‹œ์ž‘์ธ๋ฑ์Šค์™€ ์ข…๋ฃŒ์ธ๋ฑ์Šค๋ฅผ ๋ฐ›์•„ ์‹œ์ž‘์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์ข…๋ฃŒ์ธ๋ฑ์Šค ์ด์ „ ์š”์†Œ๊นŒ์ง€์˜ ์š”์†Œ๋กœ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
rangeClosed : ์ฃผ ์‚ฌ์šฉ๋ฒ•์€ range ์™€ ๊ฐ™์œผ๋‚˜, rangeClosed ๋Š” ์ข…๋ฃŒ์ธ๋ฑ์Šค ๋˜ํ•œ ํฌํ•จํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • FileStreamjava nio ์— ๋‚ด์žฅ๋œ Files ํด๋ž˜์Šค์˜ lines ๋ฉ”์†Œ๋“œ๋กœ, ํŠน์ •ํŒŒ์ผ์˜ ๊ฐ ๋ผ์ธ์„ ํ•˜๋‚˜์˜ ์š”์†Œ๋กœ String ํƒ€์ž…์˜ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
	Stream<String> fileStream = Files.lines(
    	Paths.get("stream.txt"), 
        StandardCharsets.UTF_8)
        );
  • ๊ธฐ๋ณธํƒ€์ž… ์ŠคํŠธ๋ฆผ์˜ ๋ฐ•์‹ฑ์ €ํฌ๋Š” int ํ˜• ๋ณ€์ˆ˜๋ฅผ Integer ๊ฐ์ฒด๋กœ ํ˜•๋ณ€ํ™˜ํ• ๋•Œ ์ด๋ฅผ "๋ฐ•์‹ฑ(boxing)" ์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค!
    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ IntStream ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์ŠคํŠธ๋ฆผ๋“ค์„ Stream<Integer> ๊ฐ™์€ ๊ผด๋กœ ๋ณ€ํ™˜์‹œํ‚ฌ๋•Œ ์ด๊ฒƒ์„ ๋ฐ•์‹ฑ์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ๊ธฐ๋ณธํƒ€์ž…์ŠคํŠธ๋ฆผ์€ ์ด๋ฅผ boxed ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ง€์›ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค!
	Stream<Integer> boxedIntStream = IntStream.range(1, 5).boxed();

์ง€๊ธˆ๊นŒ์ง€ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค!

์ ์‹œ ์ ์†Œ์— ์•Œ๋งž์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋”์šฑ ๋†’์€ ๊ฐ€๋…์„ฑ์„ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์˜ˆ๋ฅผ๋“ค์–ด, 1๋ถ€ํ„ฐ 100๊นŒ์ง€์˜ ๋ชจ๋“  ์ž์—ฐ์ˆ˜๊ฐ€์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด?

IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList());
//์ถ”ํ›„ ๋ฐฐ์šธ collect(Collectors.toList()) ๋Š” ์ŠคํŠธ๋ฆผ์„ List ์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค!

for ๋ฌธ์œผ๋กœ ํ•œ๋‹ค๋ฉด ์ ์–ด๋„ 3์ค„์ด ๋˜์—ˆ์„ ๋ฌธ์žฅ์ด, ํ•˜๋‚˜์˜ ๋ฌธ์žฅ์œผ๋กœ ํ•ด๊ฒฐ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
์ด๋ ‡๊ฒŒ ํŽธํ•œ ์ŠคํŠธ๋ฆผ! ๊ผญ ์จ์ฃผ์‹ค๊บผ์ฃ ? ๐Ÿ˜„
๊ทธ๋Ÿผ ๋‹ค์Œ์‹œ๊ฐ„์— ์ŠคํŠธ๋ฆผ์˜ ๊ฐ€๊ณต๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์ฐพ์•„๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค!!

๋ชจ๋‘ ๊ฑด๊ฐ•์กฐ์‹ฌํ•˜๊ณ  ๋‹ค์Œ์— ๋งŒ๋‚˜์š”~!!

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ

๋Œ“๊ธ€ ์˜์—ญ