Day14 - jeremy0405/Codesquad_CS GitHub Wiki

๋žŒ๋‹ค์™€ ์ŠคํŠธ๋ฆผ

๋‚ด๊ฐ€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ•œ ๊ฑด ์ž๋ฐ” ๊ณต๋ถ€๋ฅผ ๋ง‰ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ธํ…”๋ฆฌ์ œ์ด์˜ ์ถ”์ฒœ์œผ๋กœ ๋‚ด ์ฝ”๋“œ๋ฅผ ๋žŒ๋‹ค์‹์œผ๋กœ ๋ฐ”๊ฟจ์„ ๋•Œ์ด๋‹ค. ๋ณด๊ธฐ์— ๊ต‰์žฅํžˆ ๋ฉ‹์žˆ์–ด ๋ณด์—ฌ์„œ ์–ธ์  ๊ฐ€ ๋žŒ๋‹ค๋ฅผ ๊ณต๋ถ€ํ•ด์„œ ์ž์œ ์ž์žฌ๋กœ ํ™œ์šฉํ•ด์•ผ์ง€๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ ์ง€ ๋ฒŒ์จ 3๋‹ฌ์ด ํ˜๋ €๋Š”๋ฐ ์•„์ง๋„ ๋žŒ๋‹ค์™€ ์–ด์ƒ‰ํ•˜๋‹ค.. ๐Ÿ˜…

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


๋žŒ๋‹ค์‹

  • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(abstract ๋ฉ”์„œ๋“œ๊ฐ€ 1๊ฐœ)๋ฅผ ๊ฐ„๋‹จํ•œ ์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

java.util.function

์ž๋ฐ”์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์ •์˜ํ•ด๋†“์€ pakage

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์‹œ

Supplier<T>

  • T get() : input ์—†๊ณ  output : T

Consumer<T>

  • void accept(T t) : input : T, output ์—†์Œ

Function<T, R>

  • R apply(T t) : input : T, output : R

Predicate<T>

  • boolean test(T t) : input : T, output : boolean

BiConsumer<T, U>

  • void accept(T t, U u) : input : T, U, output ์—†์Œ

BiFunction<T, U, R>

  • R apply(T t, U u) : input : T, U, output : R

BiPredicate<T, U>

  • boolean test(T t, U u) : input : T, U, output boolean

์ŠคํŠธ๋ฆผ

Stream์€ ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์„ ๋งํ•œ๋‹ค. ๋žŒ๋‹ค๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•ด์„œ ํ•ญ์ƒ ๋™์ผํ•œ input์— ์œ ์ผํ•œ output์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

stream์€ ํฌ๊ฒŒ stream ์ƒ์„ฑ, ๊ฐ€๊ณต, ์ตœ์ข…์—ฐ์‚ฐ(๊ฒฐ๊ณผ ๋งŒ๋“ค๊ธฐ)์˜ ์ˆœ์„œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ง€์—ฐ์„ฑ์„ ์ด์šฉํ•ด ์ตœ์ข…์—ฐ์‚ฐ์ด ์žˆ์–ด์•ผ์ง€ ๊ฐ€๊ณต๊ณผ์ •์„ ์‹คํ–‰ํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

  • ๋ฐฐ์—ด / ์ปฌ๋ž™์…˜ / ๋นˆ ์ŠคํŠธ๋ฆผ
  • Stream.iterate()
  • ๊ธฐ๋ณธ ํƒ€์ž…ํ˜• (IntStream, LongStream)
  • ์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐํ•˜๊ธฐ

๋ฐฐ์—ด์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒ์„ฑ

Stream<Integer> stream = Arrays.stream(intArray);

Stream<Integer> partOfArrayStream = Arrays.stream(intArray, 1, 3);

1 ~ (3 - 1)๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€๋งŒ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ฌ


์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ƒ์„ฑ

Stream<Integer> stream = intList.stream()


Stream.iterate()๋กœ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

Stream<Integer> iteratedStream = Stream.iterate(30, n -> n + 2).limit(5);

์ดˆ๊ธฐ๊ฐ’์ด 30, 2์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” 5๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ([30, 32, 34, 36, 38])

๊ผญ limit(5); ์ฒ˜๋Ÿผ ์‚ฌ์ด์ฆˆ๋ฅผ ์ œํ•œํ•ด์•ผ ํ•จ. (๊ทธ๋ƒฅ iterate()๋กœ ๋งŒ๋“ค๋ฉด ์ŠคํŠธ๋ฆผ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ฌดํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ)


๊ธฐ๋ณธ ํƒ€์ž…ํ˜• ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

IntStream intStream = IntStream.range(1, 5); // 1, 2, 3, 4 ์ƒ์„ฑ

IntStream intStream = IntStream.rangeClosed(1, 5); // 1, 2, 3, 4, 5 ์ƒ์„ฑ

  • !! Random Class๋ฅผ ์ด์šฉํ•œ ๋žœ๋คํ•œ ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
    • DoubleStream randomDoubles = new Random().doubles(3); // ๋‚œ์ˆ˜ 3๊ฐœ ์ƒ์„ฑ
new Random().ints(0, 10)  
  .limit(10)  
  .forEach(System.out::println);

// 0 ~ 9 ๊นŒ์ง€์˜ ๋žœ๋คํ•œ int ๊ฐ’๋“ค์„ 10๊ฐœ ์ƒ์„ฑํ•œ ํ›„ ์ถœ๋ ฅํ•จ

์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐํ•˜๊ธฐ

Stream<String> concat = Stream.concat(strStream1, strStream2)

IntStream concat = IntStream.concat(IntStream1, IntStream2)


์ŠคํŠธ๋ฆผ ๊ฐ€๊ณตํ•˜๊ธฐ


Stream<T> filter(Predicate<? super T> predicate);

Stream<String> stream = names.stream()  
							 .filter(name -> name.contains("a"));

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

Stream<String> stream = names.stream()  
							 .map(String::toUpperCase);

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

students.stream()  
		 .flatMapToInt(student ->   
						 IntStream.of(student.getKor(),
									  student.getEng(),   				
									  student.getMath()))
		 .average().ifPresent(avg ->   
						   	  System.out.println(Math.round(avg * 10)/10.0));

Stream<T> sorted();

Stream<T> sorted(Comparator<? super T> comparator);

IntStream.of(14, 11, 20, 39, 23)  
		 .sorted()  
		 .boxed()  
		 .collect(Collectors.toList());

Stream<T> peek(Consumer<? super T> action);

์ค‘๊ฐ„์— ๊ฐ’ ํ™•์ธ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.

(์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ ๋„์ค‘ ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„).peek(System.out::println)

๊ฒฐ๊ณผ ๋งŒ๋“ค๊ธฐ


Calculating

long count = IntStream.of(1, 3, 5, 7, 9).count();  
long sum = LongStream.of(1, 3, 5, 7, 9).sum();

OptionalInt min = IntStream.of(1, 3, 5, 7, 9).min();  
OptionalInt max = IntStream.of(1, 3, 5, 7, 9).max();

DoubleStream.of(1.1, 2.2, 3.3, 4.4, 5.5)  
			.average()  
			.ifPresent(System.out::println); // Optional ๋Œ€์‹  ifPresent() ์ด์šฉ

Reduction

// 1๊ฐœ (accumulator)  
Optional<T> reduce(BinaryOperator<T> accumulator);  
  
// 2๊ฐœ (identity)  
T reduce(T identity, BinaryOperator<T> accumulator);
OptionalInt reduced = IntStream.range(1, 4) // [1, 2, 3]  
							   .reduce((a, b) -> {  
										return Integer.sum(a, b);  
									  });
 
int reducedTwoParams = IntStream.range(1, 4) // [1, 2, 3]  
								.reduce(10, Integer::sum); // method reference

Collecting

.collect(Collectors.toList());

.collect(Collectors.joining()); // String์„ ๋ชจ๋‘ ํ•ฉ์ณ์„œ ํ•˜๋‚˜์˜ String์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ
.collect(Collectors.joining(", ", "<", ">")); // joining(String์‚ฌ์ด ๊ตฌ๋ถ„์ž, ๊ฒฐ๊ณผ ๋งจ ์•ž, ๊ฒฐ๊ณผ ๋งจ ๋’ค)
String listToString =   
 productList.stream()  
 .map(Product::getName)  
 .collect(Collectors.joining(", ", "<", ">"));  
// <potatoes, orange, lemon, bread, sugar>

Matching

boolean anyMatch(Predicate<? super T> predicate);  //ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋Š”์ง€
boolean allMatch(Predicate<? super T> predicate);  // ๋ชจ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€
boolean noneMatch(Predicate<? super T> predicate); // ๋ชจ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€

forEach

void forEach(Consumer<? super T> action);
.forEach(System.out::println);

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ