๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL

JAVA Stream (์ŠคํŠธ๋ฆผ) (22.10.29 TIL)

by winteringg 2022. 10. 29.

 ๐Ÿ“ ์ŠคํŠธ๋ฆผ ํ—ท๊ฐˆ๋ฆด ๋•Œ๋งˆ๋‹ค ๊ทธ๋ƒฅ ์—ฌ๊ธฐ์—์„œ ์ฐพ์•„๋ณด๋ ค๊ณ  ๊ธฐ๋ณธ์„œ๋ฅผ ๋ณด๋ฉฐ ํ‹ˆํ‹ˆ์ด ์ •๋ฆฌํ•œ ๊ฒƒ์„ ์˜ค๋Š˜ ๋“œ๋””์–ด ์™„์„ฑํ–ˆ๋‹ค. (๋‚ด์šฉ์ด ๋‹ค์†Œ ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!) ์ŠคํŠธ๋ฆผ..๊ฐ€๋ณด์ž๊ณ ..!!


1. ์ŠคํŠธ๋ฆผ ์˜๋ฏธ
1) ์ปฌ๋ ‰์…˜์˜ ์ €์žฅ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•ด ๋žŒ๋‹ค์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฐ˜๋ณต์ž. (์ž๋ฐ”8๋ถ€ํ„ฐ ์ถ”๊ฐ€)
2) ์ž๋ฐ”7 ์ด์ „๊นŒ์ง€๋Š” List< String > ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Iterator ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ.

/* Iterator */
List<String> list = Arrays.asList("ํ™๊ธธ๋™", "๊น€์ž๋ฐ”");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
	String name = iterator.next();
}

/* Stream */
List<String> list = Arrays.asList("ํ™๊ธธ๋™", "๊น€์ž๋ฐ”");
Stream<String> stream = list.stream();
stream.forEach( name -> System.out.println(name));

 

2. ์ŠคํŠธ๋ฆผ์˜ ํŠน์ง•
1) ๋žŒ๋‹ค์‹์œผ๋กœ ์š”์†Œ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ณต.
2) ์ŠคํŠธ๋ฆผ์€ ์ž‘์—…์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ฒ˜๋ฆฌํ•จ. (for๋ฌธ์„ ๋ฉ”์„œ๋“œ ์•ˆ์œผ๋กœ ๋„ฃ์–ด์„œ ์ฒ˜๋ฆฌ)

for๋ฌธ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ forEach๋กœ ํ‘œํ˜„
forEach ๋ฉ”์„œ๋“œ ์•ˆ์— ๋“ค์–ด ์žˆ๋Š” for๋ฌธ


3) ์ž‘์—…์„ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›€.

๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ


4) ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•  ๋ฟ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ.

List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.stream().sorted()     //list๋ฅผ ์ •๋ ฌํ•ด์„œ
                      .collect(Collectors.toList());  //์ƒˆ๋กœ์šด List์— ์ €์žฅ
System.out.println(list);          // [3,1,5,4,2] ์›๋ณธ ๋ณ€๊ฒฝ ์—†์ด
System.out.println(sortedList);    // [1,2,3,4,5] ์ •๋ ฌ๋œ ๋ณต์‚ฌ๋ณธ๋งŒ ์žˆ์Œ

5) ์ŠคํŠธ๋ฆผ์€ Iterator ์ฒ˜๋Ÿผ ์ผํšŒ์šฉ์ž„. (ํ•„์š”ํ•˜๋ฉด ๋‹ค์‹œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•จ)

strStream.forEach(System.out::println);   //๋ชจ๋“  ์š”์†Œ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅ(์ตœ์ข… ์—ฐ์‚ฐ)
int numOfStr = strStream.count();         //์—๋Ÿฌ. ์ตœ์ข… ์—ฐ์‚ฐ ํ›„ ์ŠคํŠธ๋ฆผ์ด ์ด๋ฏธ ๋‹ซํž˜.

6) ์ตœ์ข… ์—ฐ์‚ฐ ์ „๊นŒ์ง€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ. (์ง€์—ฐ๋œ ์—ฐ์‚ฐ)

IntStream intStream = new Random().ints(1,46);    //1~45 ๋ฒ”์œ„์˜ ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ
intStream.distinct().limit(6).sorted()            //์ค‘๊ฐ„ ์—ฐ์‚ฐ
         .forEach(i->System.out.print(i+","));    //์ตœ์ข… ์—ฐ์‚ฐ

7) ๊ธฐ๋ณธํ˜• ์ŠคํŠธ๋ฆผ - IntStream, LongStream, DoubleStream....etc.
  - ์˜คํ† ๋ฐ•์‹ฑ & ์–ธ๋ฐ•์‹ฑ์˜ ๋น„ํšจ์œจ์ด ์ œ๊ฑฐ๋จ. (Stream<Integer> ๋Œ€์‹  IntStream ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋” ์ข‹์•„์ง)
  - ์ˆซ์ž์™€ ๊ด€๋ จ๋œ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ Stream<T>๋ณด๋‹ค ๋” ๋งŽ์ด ์ œ๊ณตํ•จ.


3. ์ŠคํŠธ๋ฆผ ๋งŒ๋“œ๋Š” ๋ฒ•

1) ์ŠคํŠธ๋ฆผ ๋งŒ๋“ค๊ธฐ

์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ ์ˆœ์„œ


2) ์ค‘๊ฐ„ ์—ฐ์‚ฐ (0~3๋ฒˆ๊นŒ์ง€)
  - ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ธ ์—ฐ์‚ฐ. ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
  - ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ์—์„œ๋Š” ๋งคํ•‘, ํ•„ํ„ฐ๋ง, ์ •๋ ฌ ์ˆ˜ํ–‰.
3) ์ตœ์ข… ์—ฐ์‚ฐ (0~1๋ฒˆ๊นŒ์ง€)
  - ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹Œ ์—ฐ์‚ฐ. ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ (์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์†Œ๋ชจ)
  - ๋ฐ˜๋ณต, ์นด์šดํŒ…, ํ‰๊ท , ์ดํ•ฉ ๋“ฑ์˜ ์ง‘๊ณ„ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰.


4. ์ŠคํŠธ๋ฆผ์˜ ์ข…๋ฅ˜

1) ์ž๋ฐ”8๋ถ€ํ„ฐ java.util.stream ํŒจํ‚ค์ง€์—์„œ ์ŠคํŠธ๋ฆผ API๋“ค์„ ์ œ๊ณตํ•จ.

 

2) ์ปฌ๋ ‰์…˜์œผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ
  - Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ stream()์œผ๋กœ ์ปฌ๋ ‰์…˜์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜

Stream<E> stream()   //Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ
===์˜ˆ์‹œ 1===
List<Studunt> studentList = Arrays.asList(
	new Student("ํ™๊ธธ๋™", 10), 
    	new Student("๊น€์ž๋ฐ”", 20)
);

Stream<Student> stream = studentList.stream();


//


===์˜ˆ์‹œ 2===
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream();   //list๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜

//์ŠคํŠธ๋ฆผ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ถœ๋ ฅ
intStream.forEach(System.out::print);   //12345
intStream.forEach(System.out::print);   //์—๋Ÿฌ. ์ตœ์ข…์—ฐ์‚ฐ ํ›„ ์ผํšŒ์šฉ์ธ ์ŠคํŠธ๋ฆผ์ด ์ด๋ฏธ ๋‹ซํž˜

intStream = list.stream();              //list๋กœ๋ถ€ํ„ฐ stream์„ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์„œ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
intStream.forEach(System.out::print);

3) ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ

Stream<T> Stream.of(T... values)  //๊ฐ€๋ณ€ ์ธ์ž
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
//from~to ๋ฐฐ์—ด์˜ ๋ฒ”์œ„ ๋งŒ๋“ค๊ธฐ (๋งˆ์ง€๋ง‰ to๋Š” ์•ˆ๋“ค์–ด๊ฐ -1)
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)

===์˜ˆ์‹œ===
Stream<String> strStream = Stream.of("a", "b", "c");   //๊ฐ€๋ณ€ ์ธ์ž
Stream<String> strStream = Stream.of(new String[]{"a", "b", "c"});
Stream<String> strStream = Arrays.stream((new String[]{"a", "b", "c"});
Stream<String> strStream = Arrays.stream((new String[]{"a", "b", "c"}, 0, 3);

 
- ๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ

IntStream IntStream.of(int... values)   //Stream ์ด ์•„๋‹Œ IntStream
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)


4) ํŠน์ • ๋ฒ”์œ„์˜ ์ •์ˆ˜๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ (IntStream, LongStream)

// rangeClosed() : ์ฒซ๋ฒˆ์งธ ์ธ์ž๊ฐ’์—์„œ ๋‘๋ฒˆ์งธ ์ธ์ž๊ฐ’๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ IntStream ๋ฆฌํ„ด (๋ ์ˆซ์ž ํฌํ•จ ์•ˆํ•จ)
IntStream IntStream.range(int begin, int end)

// rangeClosed() : ์ฒซ๋ฒˆ์งธ ์ธ์ž๊ฐ’์—์„œ ๋‘๋ฒˆ์งธ ์ธ์ž๊ฐ’๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ IntStream ๋ฆฌํ„ด (๋ ์ˆซ์ž ํฌํ•จ)
IntStream IntStream.rangeClosed(int begin, int end)

IntStream intStream = IntStream.range(1, 5);            // 1,2,3,4
IntStream intStream = IntStream.rangeClosed(1, 5);      // 1,2,3,4,5

5) ๋‚œ์ˆ˜๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ (์ž„์˜์˜ ์ˆ˜ ๋งŒ๋“ค๊ธฐ)

IntStreamintStream = new Random().ints();          //๋ฌดํ•œ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
intStream.limit(5).forEach(System.out::println);   //5๊ฐœ์˜ ์š”์†Œ๋งŒ ์ถœ๋ ฅ

IntStream intStream = new Random().ints(5);        //ํฌ๊ธฐ๊ฐ€ 5์ธ ๋‚œ์ˆ˜ ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜


//ints(), longs(), doubles() ๋ฉ”์„œ๋“œ
Integer.MIN_VALUE <= ints() <= Integer.MAX_VALUE
Long.MIN_VALUE <= longs() <= Long.MAX_VALUE
0.0 <= doubles() < 1.0

6) ๋žŒ๋‹ค์‹์œผ๋กœ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ - iterate(), generate()
  - ๋žŒ๋‹ค์‹์„ ์†Œ์Šค๋กœ ํ•˜๋Š” ๋ฌดํ•œ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)  //์ด์ „ ์š”์†Œ์— ์ข…์†์ 
static <T> Stream<T> generate(Supplier<T> s)              //์ด์ „ ์š”์†Œ์— ๋…๋ฆฝ์ 

iterate(). seed ๋ผ๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ์‚ฌ์šฉํ•จ
generate(). ์ดˆ๊ธฐ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ.

//iterate(T seed, UnaryOperator f) ๋‹จํ•ญ ์—ฐ์‚ฐ์ž
Stream<Integer> intStream = Stream.iterate(1, n -> n+2);  //ํ™€์ˆ˜ ์ถœ๋ ฅ
Stream<Integer> intStream2 = Stream.iterate(0, n -> n+2);  //์ง์ˆ˜ ์ถœ๋ ฅ
intStream.limit(10).forEach(System.out::println);
intStream2.limit(10).forEach(System.out::println);
		
//generate(Supplier s) : ์ž…๋ ฅ๋งŒ ์—†๊ณ , ์ถœ๋ ฅ๋งŒ ์žˆ์Œ
Stream<Integer> oneStream = Stream.generate(()->1);
oneStream.limit(10).forEach(System.out::println);

7) ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ
  - ํŒŒ์ผ์„ ์†Œ์Šค๋กœ ํ•˜๋Š” ์ŠคํŠธ๋ฆผ ์ƒ์„ฑํ•˜๊ธฐ

// ํŒŒ์ผ์˜ ๊ฒฝ๋กœ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Path ๊ฐ์ฒด ์ƒ์„ฑ
Path path = Paths.get("src/sec02/stream_kind/lineddata.txt");

// Charset.defaultCharset()๋Š” ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ๋ฌธ์ž์…‹
Stream<String> stream = Files.lines(path, Charset.defaultCharset());

// BufferedReader์˜ lines() ์ด์šฉ
File file = path.toFile();
FileReader fileReader = new FileReader(file);
BufferedReader br = new BufferedReader(fileReader);
stream = br.lines();

8) ๋น„์–ด์žˆ๋Š” ์ŠคํŠธ๋ฆผ ๋งŒ๋“ค๊ธฐ

9) ๋””๋ ‰ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ ์–ป๊ธฐ

 

Path path = Paths.get("C:/JavaProgramming/source");
Stream<Path> stream = Files.list(path);
stream.forEach( p -> System.out.println(p.getFileName()));


5. ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ
1) ๋ฆฌ๋•์…˜
  - ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ.
  - ์˜ˆ) ๋ฐ์ดํ„ฐ์˜ ํ•ฉ๊ณ„, ํ‰๊ท , ์ตœ๋Œ€๊ฐ’, ์นด์šดํŒ… ๋“ฑ
  - ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๋ฆฌ๋•์…˜์˜ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋ฐ”๋กœ ์ง‘๊ณ„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฆฌ๋•์…˜์ด ์ง‘๊ณ„ํ•˜๊ธฐ ์ข‹๋„๋ก ํ•„ํ„ฐ๋ง, ๋งคํ•‘, ์ •๋ ฌ, ๊ทธ๋ฃนํ•‘ ๋“ฑ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ํ•„์š”
2) ์ค‘๊ฐ„์ฒ˜๋ฆฌ์™€ ์ตœ์ข… ์ฒ˜๋ฆฌ
  - ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ์˜ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ์™€ ์ตœ์ข… ์ฒ˜๋ฆฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ(์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ŠคํŠธ๋ฆผ์ด ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ)๋กœ ํ•ด๊ฒฐ. ์ตœ์ข… ์ฒ˜๋ฆฌ ์‹œ์ž‘ ์ „๊นŒ์ง€ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ๋Š” ์ง€์—ฐ๋จ.

์˜ˆ) ํšŒ์› ์ปฌ๋ ‰์…˜์—์„œ ๋‚จ์ž ํ‰๊ท  ๋‚˜์ด ์ง‘๊ณ„ํ•˜๊ธฐ

double ageAvg = list.stream()  			// ์˜ค๋ฆฌ์ง€๋‚  ์ŠคํŠธ๋ฆผ
    .filter(m -> m.getSex() == Member.MALE)  	// ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ
    .mapToInt(Member :: getAge)  		// ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ
    .average()  				// ์ตœ์ข… ์ฒ˜๋ฆฌ
    .getAsDouble

 

6. ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ - ์ค‘๊ฐ„ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ

1) ํ•„ํ„ฐ๋ง
  - ์š”์†Œ๋“ค์„ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ distinct(), filter()๋Š” ๋ชจ๋“  ์ŠคํŠธ๋ฆผ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ.

2) ๋งคํ•‘
  - ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์ž‘์—….
  -  flatMap() : ์š”์†Œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ณต์ˆ˜ ๊ฐœ์˜ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ ๋ฆฌํ„ด. ์ŠคํŠธ๋ฆผ์˜ ์ŠคํŠธ๋ฆผ์„ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜.

List<String> inputList1 = Arrays.asList("java8 lamda", "stream mapping");
inputList1.stream().flatMap(data -> Arrays.stream(data.split(" ")));

List<String> inputList2 = Arrays.asList("10, 20, 30", "40, 50, 60");
inputList2.stream()
    .flatMapToInt(data -> {
        String strArr = data.split(",");
        int intArr = new int[strArr,length];
        for(int i = 0; strArr > i; i++){
        	intArr[i] = Integer.parseInt(strArr[i].trim());
        }
        return Arrays.stream(intArr);
    })

  - mapXXX() : ์š”์†Œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋ฆฌํ„ด

 

List<Studunt> studentList = Arrays.asList(
	new Student("ํ™๊ธธ๋™", 10), 
    	new Student("๊น€์ž๋ฐ”", 20)
);

studentList.stream().mapToInt(Student :: getScore);

  - asDoubleStream(),asLongStream() : IntStream์˜ int ์š”์†Œ ๋˜๋Š” LongStream์˜ Long ์š”์†Œ๋ฅผ double ์š”์†Œ๋กœ ํƒ€์ž… ๋ณ€ํ™˜ํ•ด์„œ DoubleStream์„ ์ƒ์„ฑํ•œ๋‹ค.
  - boxed() : int, double ์š”์†Œ๋ฅผ Integer, Double ์š”์†Œ๋กœ ๋ฐ•์‹ฑํ•ด์„œ Stream์„ ์ƒ์„ฑํ•œ๋‹ค.

3) ์ •๋ ฌ
  - ์š”์†Œ๊ฐ€ ์ตœ์ข… ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ์š”์†Œ๋ฅผ ์ •๋ ฌ.

  - ๊ฐ์ฒด ์š”์†Œ์ผ ๊ฒฝ์šฐ ํด๋ž˜์Šค๊ฐ€ Comparable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด sorted()๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ.

  - ๊ธฐ๋ณธ ๋น„๊ต ๋ฐฉ๋ฒ•์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

sorted();
sorted( (a,b) -> a.compareTo(b) );
sorted(Comparator.naturalOrder());

  - ๊ธฐ๋ณธ ๋น„๊ต ๋ฐฉ๋ฒ•๊ณผ ์ •๋ฐ˜๋Œ€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

sorted( (a,b) -> b.compareTo(a) );
sorted( Comparator.reversOrder() );

 

7. ์ŠคํŠธ๋ฆผ์˜ ์—ฐ์‚ฐ - ์ตœ์ข… ์—ฐ์‚ฐ

1) ๋งค์นญ
  - allMatch() : ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์กฐ์‚ฌ
  - anyMatch() : ์ตœ์†Œํ•œ 1๊ฐœ์˜ ์š”์†Œ๊ฐ€ ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ์กฐ์‚ฌ
  - noneMatch() : ๋ชจ๋“  ์š”์†Œ๋“ค์ด ๋งค๊ฐœ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„ Predicate์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ์กฐ์‚ฌ

2) Optional<T>
  - T ํƒ€์ž… ๊ฐ์ฒด์˜ ๋ž˜ํผ ํด๋ž˜์Šค.
  - ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ. (null ๋„ ๊ฐ€๋Šฅ)
  - ์ง‘๊ณ„ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉฐ ์ง‘๊ณ„ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋””ํดํŠธ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.
  - ์ง‘๊ณ„ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” Consumer๋„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Œ.
  - OptionalXXX ํƒ€์ž…์—์„œ ๊ฐ’์„ ์–ป์œผ๋ ค๋ฉด get(), getAsXXX()๋ฅผ ํ˜ธ์ถœ.

 

// isPresent()
OptionalDoble optional = list.stream().mapToInt(Integer :: intValue).average();

if(optional.isPresent()){
	~
}else{
	~
}

// orElse()
double avg = list.stream().mapToInt(Integer :: intValue).average().orElse(0.0);

// ifPresent() : ๊ฐ’์ด ์žˆ์„ ๊ฒฝ์šฐ ๋žŒ๋‹ค์‹ ์‹คํ–‰
list.stream().mapToInt(Integer :: intValue).average().ifPresent(a -> ~);


3) ์ปค์Šคํ…€ ์ง‘๊ณ„
  - reduce() : ๋‹ค์–‘ํ•œ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์†Œ๋“œ

// ์š”์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ NoSuchElementException ๋ฐœ์ƒ
int sum = studentList.stream()
	.map(Student :: getScore)
	.reduce((a,b) -> a + b)
	.get();
    
// ์š”์†Œ๊ฐ€ ์—†์–ด๋„ default ๊ฐ’ 0 ๋ฆฌํ„ด    
int sum = studentList.stream()
	.map(Student :: getScore)
	.reduce(0, (a,b) -> a + b)
	.get();

 

4) ์ˆ˜์ง‘
  - collect() : ์š”์†Œ๋ฅผ ํ•„ํ„ฐ๋ง, ๋งคํ•‘ํ•œ ํ›„ ์ปฌ๋ ‰์…˜์— ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ข… ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ

// ๋งค๊ฐœ๊ฐ’์ธ Collector๋Š” ์–ด๋–ค ์š”์†Œ๋ฅผ ์ˆ˜์ง‘ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •
// ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์˜ T๋Š” ์š”์†Œ, A๋Š” ๋ˆ„์ ๊ธฐ, R์€ ์š”์†Œ๊ฐ€ ์ €์žฅ๋  ์ปฌ๋ ‰์…˜
R(๋ฆฌํ„ดํƒ€์ž…) | collect(Collector<T,A,R> collector) | Stream(์ธํ„ฐํŽ˜์ด์Šค)

 
  -  Collector์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” Collectors์˜ ์ •์  ๋ฉ”์†Œ๋“œ

 

  - ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ˆ˜์ง‘

1) ์ฒซ ๋ฒˆ์งธ Supplier๋Š” ์š”์†Œ๋“ค์ด ์ˆ˜์ง‘๋œ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ.
  - ์ˆœ์ฐจ ์ฒ˜๋ฆฌ(์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ) ์ŠคํŠธ๋ฆผ : ํ•œ๋ฒˆ ์‹คํ–‰, ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด ์ƒ์„ฑ
  - ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ) ์ŠคํŠธ๋ฆผ : ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰, ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ -> ์ตœ์ข…์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋กœ ๊ฒฐ

2) ๋‘๋ฒˆ ์งธ XXXConsumer๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด(R)์— ์š”์†Œ(T)๋ฅผ ์ˆ˜์ง‘.
  - ์ŠคํŠธ๋ฆผ์—์„œ ์š”์†Œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์ˆ˜์ง‘ํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰.
  - ์„ธ๋ฒˆ ์งธ XXXConsumer๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด(R)๋ฅผ ๊ฒฐํ•ฉ. (๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋งŒ ํ˜ธ์ถœ)

// ๊ธฐ๋ณธ
Stream<Student> totalStream = totalList.stream();
Stream<Student> maleStream = totalList.filter(s -> s.getSex() == Student.Sex.MALE);
Supplier<MaleStudent> supplier = ()->new MaleStudent();
BiConsumer<MaleStudent, Student> accumulator = (ms, s) -> ms.accumulate(s);
BiConsumer<MaleStudent, MaleStudent> combiner = (ms1, ms2) -> ms1.combine(ms2);
MaleStudent maleStudent = maleStream.collect(supplier, accumulator, combiner);

// ๋ณ€์ˆ˜ ์ƒ๋žต
MaleStudent maleStudent = totalList.stream()
	.filter(s->s.getSex() == Student.Sex.MALE)
    .collect(
    	() -> new MaleStudent(),
        (r, t) -> r.accumulate(t),
        (r1, r2) -> r1.combine(r2)
    );
    
// ๋žŒ๋‹ค์‹ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ
MaleStudent maleStudent = totalList.stream()
	.filter(s -> s.getSex() == Student.Sex.MALE)
    .collect(MaleStudent :: new
    	   , MaleStudent :: accumulate
           , MaleStudent :: combine);


  - ์š”์†Œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ์ˆ˜์ง‘
     - collect()๋Š” ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•ด์„œ Map ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต

Map<Student.Sex, List<Student>> mapBySex = totalList.stream()
	.collect(Collectors.groupingBy(student :: getSex));

 
- ๊ทธ๋ฃนํ•‘ ํ›„ ๋งคํ•‘ ๋ฐ ์ง‘๊ณ„
     - ๊ทธ๋ฃนํ•‘ ํ›„ ๋งคํ•‘, ์ง‘๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๊ฐ’์œผ๋กœ Collector๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.

Map<Student.Sex, Double> mapBySex = totalList.stream()
	.collect(
    	Collectors.groupingBy{
        	Student :: getSex,
            Collectors.averagingDouble(Student :: getScore)
        }
    );

 

8. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
1) ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ : ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋ถ„ํ• ํ•ด์„œ ๊ฐ๊ฐ์˜ ์ฝ”์–ด๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ
2) ๋ชฉ์  : ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๊ฐ์†Œ
3) ๋™์‹œ์„ฑ(Concurrency)๊ณผ ๋ณ‘๋ ฌ์„ฑ(Parallelism)
  - ๋™์‹œ์„ฑ : ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ์„ฑ์งˆ
  - ๋ณ‘๋ ฌ์„ฑ : ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ์ฝ”์–ด๋ฅผ ์ด์šฉํ•ด ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ์„ฑ์งˆ

4) ๋ณ‘๋ ฌ์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ๊ณผ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  - ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ : ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ชผ๊ฐœ์–ด ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค๊ณ , ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•ด์„œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ๋๋‚ด๋Š” ๊ฒƒ
  → ์ž๋ฐ”8์ด ์ง€์›ํ•˜๋Š” ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ
  → ๋ฉ€ํ‹ฐ ์ฝ”์–ด์˜ ์ˆ˜๋งŒํผ ๋Œ€์šฉ๋Ÿ‰ ์š”์†Œ๋ฅผ ์„œ๋ธŒ ์š”์†Œ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ๊ฐ์˜ ์„œ๋ธŒ ์š”์†Œ๋“ค์„ ๋ถ„๋ฆฌ๋œ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ ์‹œํ‚ด
  - ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ : ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ
    → ์˜ˆ) ์›น ์„œ๋ฒ„, ๊ฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญํ•œ ๊ฒƒ์„ ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ

9. ํฌํฌ์กฐ์ธ(ForkJoin) ํ”„๋ ˆ์ž„์›Œํฌ
1) ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์‹œ์— ํฌํฌ์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ๋™์ž‘
2) ํฌํฌ ๋‹จ๊ณ„ : ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋กœ ๋ถ„๋ฆฌํ•œ ํ›„ ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ
3) ์กฐ์ธ ๋‹จ๊ณ„ : ์„œ๋ธŒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ๋‹ค.

  - ํฌํฌ์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์Šค๋ ˆ๋“œํ’€์ธ ForkJoinPool์„ ์ œ๊ณต.
  - ๊ฐ ์ฝ”์–ด์—์„œ ์„œ๋ธŒ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ณ„ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ํ•„์š”

10. ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ

1) parallelStream()์€ ์ปฌ๋ ‰์…˜์œผ๋กœ๋ถ€ํ„ฐ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์„ ๋ฐ”๋กœ ๋ฆฌํ„ด.
2) parallel()๋Š” ์ˆœ์ฐจ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ์„ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฆฌํ„ด.
3 ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ
  - ์š”์†Œ์˜ ์ˆ˜์™€ ์š”์†Œ๋‹น ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
    → ์ปฌ๋ ‰์…˜์— ์š”์†Œ์˜ ์ˆ˜๊ฐ€ ์ ๊ณ  ๊ฐ ์š”์†Œ์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์งง์œผ๋ฉด ์ˆœ์ฐจ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ.
    → ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ์Šค๋ ˆ๋“œํ’€ ์ƒ์„ฑ, ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์ด๋ผ๋Š” ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ ๋ฐœ์ƒ.
4) ์ŠคํŠธ๋ฆผ ์†Œ์Šค์˜ ์ข…๋ฅ˜
  - ArrayList, ๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๋กœ ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋œ๋‹ค.
  - HashSet, TreeSet, LinkedList๋Š” ์š”์†Œ ๋ถ„๋ฆฌ๊ฐ€ ์‰ฝ์ง€ ์•Š์•„ ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ๋‹ค.
  - ์ฝ”์–ด์˜ ์ˆ˜ : ์‹ฑ๊ธ€ ์ฝ”์–ด์ผ ๊ฒฝ์šฐ ์ˆœ์ฐจ ์ฒ˜๋ฆฌ๊ฐ€ ๋น ๋ฅด๋‹ค. ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ ์‹œ ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋งŒ ์ฆ๊ฐ€ํ•˜๊ณ  ๋™์‹œ์„ฑ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ข‹์ง€ ์•Š๋‹ค.

 

 

 

 

์ฐธ๊ณ  : [ํ•œ๋น›๋ฏธ๋””์–ด] ์ด๊ฒƒ์ด ์ž๋ฐ”๋‹ค (์‹ ์šฉ๊ถŒ์˜ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ •๋ณต) Chapter 16.์ŠคํŠธ๋ฆผ
์ฐธ๊ณ  : [๋„์šฐ์ถœํŒ] JAVA์˜ ์ •์„(3ND EDITION)-์ž๋ฐ”์˜ ์ •์„ ์ตœ์‹  Java 8.0 ํฌํ•จ Chapter 14.๋žŒ๋‹ค์™€ ์ŠคํŠธ๋ฆผ

๋Œ“๊ธ€