24-3.ÃÖÁ¾ ¿¬»ê

24-3-1.¿ä¼Ò Á¶»ç

½ºÆ®¸² ¿¬»êÀº °ªÀ» Á¶ÀÛÇÏ¿© ÃÖÁ¾ °á°ú¸¦ ¸¸µé¾î ³½´Ù. Áß°£¿¡ ¿©·¯ °¡Áö ¿¬»êÀÌ ³¢¾îµé ¼ö ÀÖÁö¸¸ ÃÖÁ¾ÀûÀ¸·Î´Â ¹º°¡ °ªÀ» »êÃâÇØ¾ß Çϸç ÃÖÁ¾ ¿¬»êÀÇ °á°ú´Â ½ºÆ®¸²ÀÌ ¾Æ´Ï¶ó Çհ質 °Ë»ö °á°ú µî ƯÁ¤ ŸÀÔÀÇ °ªÀÌ´Ù. °¡Àå °£´ÜÇÑ ÃÖÁ¾ ¿¬»êÀº ½ºÆ®¸²¿¡ ¼ÓÇÑ ¿ä¼ÒÀÇ °³¼ö¸¦ ±¸ÇÏ´Â count()ÀÌ´Ù.

 

long count()

 

¸®ÅÏ Å¸ÀÔÀÌ int°¡ ¾Æ´Ï¶ó longÀ¸·Î µÇ¾î Àִµ¥ °Å´ëÇÑ ½ºÆ®¸²Àº 20¾ï °³ ÀÌ»óÀÇ ¿ä¼Ò¸¦ °¡Áú ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â Ä÷º¼Ç¿¡ ¼ÓÇÑ ³ª¶óÀÇ °³¼ö¸¦ ±¸ÇØ Ãâ·ÂÇÑ´Ù.

 

count

class JavaTest {

     public static void main(String[] args) {

          System.out.println(Data.nara.stream().count());

     }

}

½ÇÇà°á°ú

10

 

´ÙÀ½Àº Á¶°ÇÀ» Á¡°ËÇØ º¸°í ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ ÀÖ´ÂÁö Á¶»çÇÏ¿© ÁøÀ§ÇüÀ» ¸®ÅÏÇÑ´Ù.

 

boolean anyMatch(Predicate<T> predicate)

boolean allMatch(Predicate<T> predicate)

boolean noneMatch(Predicate<T> predicate)

 

¸ðµÎ ¼­¼úÀÚ¸¦ Àμö·Î ÃëÇÏ¿© Á¡°ËÇÒ Á¶°ÇÀ» ÁöÁ¤ÇÑ´Ù. ¸Þ¼­µå À̸§ÀÌ ÀǹÌÇϵíÀÌ anyMatch´Â Çϳª¶óµµ ÀÖ´ÂÁö, allMatch´Â ÀüºÎ ¸¸Á·ÇÏ´ÂÁö, noneMatch´Â Á¶°Ç¿¡ ¸Â´Â°Ô Çϳªµµ ¾ø´ÂÁö Á¡°ËÇÑ´Ù.

 

allmatch

class JavaTest {

     public static void main(String[] args) {

          System.out.println(Data.nara.stream().anyMatch(c -> c.cont == Cont.AFRICA));

          System.out.println(Data.nara.stream().allMatch(c -> c.popu > 10));

          System.out.println(Data.nara.stream().noneMatch(c -> c.popu < 8));

     }

}

½ÇÇà°á°ú

true

false

true

 

¿©·¯ °¡Áö Á¶°ÇÀ¸·Î ½ºÆ®¸²ÀÇ ¿ä¼Ò¸¦ Á¶»çÇØ º¸¾Ò´Ù. ¾ÆÇÁ¸®Ä«¿¡ ¼ÓÇÑ ³ª¶ó´Â ÀÖ´Ù°í Á¶»çµÈ´Ù. ¸ðµç ³ª¶óÀÇ Àα¸°¡ õ¸¸¸íÀÌ ³Ñ´ÂÁö Á¶»çÇߴµ¥ Çë°¡¸®°¡ 9¹é¸¸¸íÀ̶ó °ÅÁþÀÌ´Ù. 8¹é¸¸ ¹Ì¸¸ÀÇ ³ª¶ó´Â ¾ø´Â °ÍÀ¸·Î Á¶»çµÈ´Ù.

ÀÌ ¸Þ¼­µå´Â ³í¸® ¿¬»êÀÚ¿Í ¸¶Âù°¡Áö·Î ¼îÆ® ¼­Å°Æ® ±â´ÉÀÌ ÀÖ´Ù. anyMatch´Â ´Ü Çϳª¶óµµ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ ¹ß°ßµÇ¸é ´õ ÀÌ»ó µÚÂÊÀº º¸Áö ¾Ê°í true¸¦ ¸®ÅÏÇÑ´Ù. ´Ù¸¥ ¸Þ¼­µåµµ ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù. ´ÙÀ½ µÎ ¸Þ¼­µå´Â ½ºÆ®¸²ÀÇ ÃÖ´ë, ÃÖ¼Ò°ªÀ» Á¶»çÇÑ´Ù.

 

Optional<T> max(Comparator<T> comparator)

Optional<T> min(Comparator<T> comparator)

 

¿ä¼Ò ºñ±³¿¡ »ç¿ëÇÒ ºñ±³ÀÚ¸¦ Àμö·Î Àü´ÞÇÑ´Ù. ºñ±³ÀÚ´Â ¾ÕÂÊ ÇÇ¿¬»êÀÚ°¡ ´õ Å©¸é ¾ç¼ö, µÚÂÊ ÇÇ¿¬»êÀÚ°¡ ´õ Å©¸é À½¼ö, µÎ °ªÀÌ °°À¸¸é 0À» ¸®ÅÏÇÑ´Ù. ½ºÆ®¸²ÀÌ ºñ¾î ÀÖÀ» ¼öµµ ÀÖ¾î T°¡ ¾Æ´Ñ Optional<T>¸¦ ¸®ÅÏÇϴµ¥ ÀÌ Å¸ÀÔ¿¡ ´ëÇؼ­´Â Àá½Ã ÈÄ µû·Î ¿¬±¸ÇØ º¸ÀÚ.

 

minmax

½ÇÇà°á°ú

class JavaTest {

     public static void main(String[] args) {

          Optional<Integer> max = Data.nara.stream().

                   map(Country::getPopu).

                   max((a, b) -> a-b);

          System.out.println(max.get());

          Optional<Integer> min = Data.nara.stream().

                   map(Country::getPopu).

                   min((a, b) -> a-b);

          System.out.println(min.get());

     }

}

1355

9

 

nara ½ºÆ®¸²À» Àα¸¼öÀÇ Á¤¼ö ½ºÆ®¸²À¸·Î ¹Ù²Û ÈÄ max¿Í minÀ¸·Î ºñ±³ÀÚ¸¦ Àü´ÞÇϸé ÃÖ´ë, ÃÖ¼Ò°ªÀ» ã¾Æ ÁØ´Ù. (a, b) -> a-b  ¶÷´Ù Ç¥Çö½Ä ´ë½Å¿¡ Integer::compare ¸Þ¼­µå ·¹ÆÛ·±½º¸¦ Àü´ÞÇصµ È¿°ú´Â °°´Ù.

24-3-2.Optional

°´Ã¼°¡ ¾ø´Â »óŸ¦ º¸Åë null·Î Ç¥±âÇÑ´Ù. Áö±Ý±îÁö ÈçÈ÷ »ç¿ëµÈ ÀϹÝÀûÀÎ ¹æ½ÄÀÌ°í Àͼ÷ÇÏ°Ô »ç¿ëÇÏ°í ÀÖÁö¸¸ °£°á¼º ¸é¿¡¼­ ºÒÆíÇÑ ¸éÀÌ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸ÀÚ.

 

nullable

½ÇÇà°á°ú

class Notebook {

     String model;

     Notebook(String model) { this.model = model; }

}

 

class Human {

     int age;

     String name;

     Notebook book;

    

     Human(int age, String name, String model) {

          book = new Notebook(model);

          this.age = age;

          this.name = name;

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "¼¾½º");

          useBook(kim);

     }

    

     static void useBook(Human human) {

          System.out.println("³» ³ëÆ®ºÏ : " + human.book.model);

     }

}

³» ³ëÆ®ºÏ : ¼¾½º

 

ÀÌ ¿¹Á¦´Â »ç¶÷ÀÌ ³ëÆ®ºÏÀ» ¼ÒÀ¯ÇÑ »óŸ¦ Ç¥ÇöÇÑ´Ù. main¿¡¼­ ³ëÆ®ºÏÀ» °¡Áø »ç¶÷ °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ ³ëÆ®ºÏÀ» »ç¿ëÇÏ´Â useBook ¸Þ¼­µå¸¦ È£ÃâÇß´Ù. ÀÌ ¸Þ¼­µå´Â ³ëÆ®ºÏÀÇ ¸ðµ¨¸íÀ» Ãâ·ÂÇÏ¿© ÀÚ¶û¸¸ ÇÑ´Ù.

useBook¿¡¼­ ³ëÆ®ºÏ ¸ðµ¨¸íÀ» ¹«ÀÛÁ¤ Ãâ·ÂÇϴµ¥ Àμö·Î Àü´Þ¹ÞÀº humanÀÌ nullÀÏ ¼ö ÀÖ´Ù. ¶Ç »ç¶÷¸¶´Ù ´Ù ³ëÆ®ºÏÀ» °¡Áö´Â°Ô ¾Æ´Ï¾î¼­ ³ëÆ®ºÏµµ nullÀÌ µÉ ¼ö ÀÖ´Ù. null°ªÀ» ÂüÁ¶ÇÏ¸é ½ÇÇàÁß¿¡ ¿¹¿Ü°¡ ¹ß»ýÇϹǷΠif¹®À¸·Î Á¶°ÇÀ» Á¡°ËÇÏ´Â ¹æ¾îÀû Äڵ带 ÀÛ¼ºÇÏ´Â°Ô º¸ÅëÀÌ´Ù.

 

if (human != null) {

     Notebook book = human.book;

     if (book != null) {

          System.out.println("³» ³ëÆ®ºÏ : " + human.book.model);

     }

}

 

µÑ Áß Çϳª¶óµµ nullÀÌ¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. ¹°·Ð nullÀÏ °æ¿ìÀÇ Ã³¸®¸¦ º°µµÀÇ elseÀý·Î ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. ¾ÆÁÖ »ó½ÄÀûÀÎ ÄÚµåÁö¸¸ µé¿©¾²±â°¡ ±í°í ºñÁ¤»óÀûÀÎ »óȲ¿¡ ´ëÇÑ Ã³¸®°¡ ¸¹¾Æ ÇÙ½É Äڵ尡 Àß º¸ÀÌÁö ¾Ê´Â´Ù. if¹®º¸´Ù´Â ¿¹¿Ü ó¸® ±¸¹®ÀÌ ´õ °£´ÜÇÏÁö¸¸ ¹ø°Å·Î¿î °ÍÀº ¿©ÀüÇÏ´Ù.

 

try {

     System.out.println("³» ³ëÆ®ºÏ : " + human.book.model);

}

catch (NullPointerException e) {

     System.out.println(e.getMessage());         

}

 

¸ðµç °´Ã¼ ·¹ÆÛ·±½º¿¡ ´ëÇØ null ¹æ¾î Äڵ尡 ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. Human.nameÀ̳ª Notebook.model¿¡ ´ëÇؼ­´Â ÀÌ·± Äڵ尡 ±»ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù. »ç¶÷ À̸§ÀÌ ¾ø´Ù´Â °ÍÀº ½ÇÇàÁß¿¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¿¹¿Ü »óȲÀÌ ¾Æ´Ï¶ó µðÀÚÀκÎÅÍ ¹º°¡ À߸øµÈ °ÍÀÌ´Ù. ÀÌ·± »óȲÀº À־´Â ¾ÈµÇ¸ç Ȥ½Ã¶óµµ ¿¹¿Ü°¡ ¹ß»ýÇÏ¸é ½ÇÇàÁß¿¡ ÇØ°áÇÒ °Ô ¾Æ´Ï¶ó ÇÁ·Î±×·¥À» ¶â¾î °íÃÄ¾ß ÇÑ´Ù.

¹Ý¸é book Çʵå´Â ÀÖÀ» ¼öµµ ÀÖ°í ¾øÀ» ¼öµµ ÀÖ´Ù. ¸ðµç »ç¶÷ÀÌ ³ëÆ®ºÏÀ» ¼ÒÀ¯ÇÏ´Â °ÍÀº ¾Æ´Ï¹Ç·Î µÑ ´Ù Á¤»óÀûÀÎ »óȲÀÌ´Ù. ÀÌ·± »óȲÀ» Ç¥ÇöÇϱâ À§ÇØ ÀÚ¹Ù 8¿¡¼­ Optional<T> Ŭ·¡½º°¡ µµÀԵǾú´Ù. Optional<T>´Â T ŸÀÔÀÇ °´Ã¼¸¦ °¡Áø »óÅÂ¿Í ¾Æ¹«°Íµµ °¡ÁöÁö ¾ÊÀº »óŸ¦ Ç¥ÇöÇÏ´Â ÄÁÅ×À̳ÊÀÌ´Ù. °´Ã¼¸¦ °¨½ÎÁö¸¸ ¾ø´Â °æ¿ì±îÁö Æ÷°ýÇÑ´Ù. ´ÙÀ½ ¼¼ °³ÀÇ Á¤Àû ¸Þ¼­µå·Î »ý¼ºÇÑ´Ù.

 

static <T> Optional<T> empty()

static <T> Optional<T> of(T value)

static <T> Optional<T> ofNullable(T value)

 

empty´Â ºó »óÅ·Π»ý¼ºÇϸç of´Â °´Ã¼¸¦ ÀúÀåÇÑ »óÅ·ΠÃʱâÈ­ÇÑ´Ù. ofNullableÀº Àμö·Î Àü´ÞµÈ °ªÀ» ÀúÀåÇ쵂 nullÀÌ¸é ºó »óÅ·ΠÃʱâÈ­ÇÑ´Ù. ³»ºÎ¿¡ ÀúÀåµÈ °´Ã¼¸¦ ÀÐÀ» ¶§´Â ´ÙÀ½ µÎ ¸Þ¼­µå¸¦ »ç¿ëÇÑ´Ù.

 

boolean isPresent()

T get()

 

isPresent´Â °´Ã¼°¡ ÀúÀåµÇ¾î ÀÖ´ÂÁö Á¶»çÇÑ´Ù. ÀÌ ¸Þ¼­µå°¡ true¸¦ ¸®ÅÏÇÏ¸é ³»ºÎ¿¡ °´Ã¼°¡ ÀÖ´Â °ÍÀ̸ç get ¸Þ¼­µå·Î °´Ã¼¸¦ ¾ÈÀüÇÏ°Ô ÀÐÀ» ¼ö ÀÖ´Ù. ¸¸¾à ºó »óÅ¿¡¼­ getÀ» È£ÃâÇÏ¸é ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ¿¹Á¦¸¦ ´Ù½Ã ¸¸µé¾î º¸ÀÚ.

 

optional

import java.util.*;

 

class Notebook {

     String model;

     Notebook(String model) { this.model = model; }

}

 

class Human {

     int age;

     String name;

     Optional<Notebook> book;

    

     Human(int age, String name, String model) {

          if (model == null || model.length() == 0) {

              book = Optional.empty();

          } else {

              book = Optional.of(new Notebook(model));

          }

          this.age = age;

          this.name = name;

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "·¹³ëº¸");

          useBook(kim);

          Human lee = new Human(44, "À̽¿ì", null);

          useBook(lee);

     }

    

     static void useBook(Human human) {

          if (human.book.isPresent()) {

              String model = human.book.get().model;

              System.out.println("³» ³ëÆ®ºÏ : " + model);

          } else {

              System.out.println("³ëÆ®ºÏÀÌ ¾ø´Ù.");

          }

     }

}

½ÇÇà°á°ú

³» ³ëÆ®ºÏ : ·¹³ëº¸

³ëÆ®ºÏÀÌ ¾ø´Ù.

 

Human Ŭ·¡½ºÀÇ book Çʵå´Â Optional<Notebook> ŸÀÔÀ¸·Î º¯°æµÇ¾ú´Ù. Áï, ³ëÆ®ºÏÀ» °¡Áú ¼öµµ ÀÖ°í ¾Æ´Ò ¼öµµ ÀÖ´Ù. »ý¼ºÀÚ´Â ³ëÆ®ºÏ À̸§ÀÌ Àִ°¡ ¾Æ´Ñ°¡¿¡ µû¶ó bookÀ» ºñ¿ö ³õ°Å³ª ¾Æ´Ï¸é ³ëÆ®ºÏ °´Ã¼¸¦ »ý¼ºÇÏ¿© ÀúÀåÇÑ´Ù.

useBook ¸Þ¼­µå´Â isPresent ¸Þ¼­µå·Î ³ëÆ®ºÏÀÌ ÀÖ´ÂÁö Á¡°ËÇÑ ÈÄ ÀÖÀ¸¸é get ¸Þ¼­µå·Î ³ëÆ®ºÏÀ» ÀÐ°í ¾øÀ¸¸é ¾ø´Ù°í Ç¥½ÃÇÑ´Ù. ÀÌ ¿¹Á¦´Â ³ëÆ®ºÏÀ» °¡Áø °´Ã¼¿Í ±×·¸Áö ¾ÊÀº °´Ã¼ ¸ðµÎ¿¡ ´ëÇØ ÈǸ¢ÇÏ°Ô Àß µ¿ÀÛÇÑ´Ù. ±×·¯³ª ÀÌ·¸°Ô Á¶°ÇÀ» Á¡°ËÇÒ ¹Ù¿¡¾ß if ¹®À¸·Î nullÀ» Á¡°ËÇÏ´Â °Í°ú º°¹Ý ´Ù¸¦°Ô ¾ø¾î º¸ÀδÙ. OptionalÀº ´Ü¼øÇÑ Ã¼Å©º¸´Ù ´õ ¸¹Àº ±â´ÉÀ» Á¦°øÇÑ´Ù. ´ÙÀ½ ¸Þ¼­µå´Â ºñ¾î ÀÖÁö ¾ÊÀ» ¶§ÀÇ µ¿ÀÛÀ» ¶÷´Ù½ÄÀ¸·Î ÁöÁ¤ÇÑ´Ù.

 

void ifPresent(Consumer<T> consumer)

 

°´Ã¼°¡ ÀÖÀ¸¸é ÀÌ ¶÷´Ù½ÄÀ» ½ÇÇàÇÏ¿© µ¿ÀÛÀ» ¼öÇàÇÏ¸ç ºñ¾î ÀÖÀ¸¸é ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù. ÀÌ ¸Þ¼­µå ÀÚü°¡ if¹®À» ´ë½ÅÇÑ´Ù.

 

ifpresent

....

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "·¹³ëº¸");

          useBook(kim);

          Human lee = new Human(44, "À̽¿ì", null);

          useBook(lee);

     }

    

     static void useBook(Human human) {

          human.book.ifPresent(b -> System.out.println("³» ³ëÆ®ºÏ : " + b.model));

     }

}

½ÇÇà°á°ú

³» ³ëÆ®ºÏ : ·¹³ëº¸

 

³ëÆ®ºÏ ¸ðµ¨¸íÀ» Ãâ·ÂÇÏ´Â Äڵ带 ifPresent ¸Þ¼­µå¾È¿¡ ¶÷´Ù½ÄÀ¸·Î ÀÛ¼ºÇß´Ù. ³ëÆ®ºÏÀ» °¡Áø °æ¿ì¸¸ Ãâ·ÂµÇ¸ç ±×·¸Áö ¾ÊÀ¸¸é Ãâ·Â¹®À» ¹«½ÃÇÑ´Ù. ´ÙÀ½ ¸Þ¼­µå´Â Á¶°Ç ÁøÀ§ ¿©ºÎ¿¡ µû¶ó ´Ù¸¥ Á¶Ä¡¸¦ ÃëÇÑ´Ù.

 

T orElse(T other)

T orElseGet(Supplier<T> other)

<X> T orElseThrow(Supplier<X> exceptionSupplier)

 

orElse ¸Þ¼­µå´Â ºñ¾î ÀÖÀ» °æ¿ì ´Ù¸¥ ´ëüÀûÀÎ °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ºñ¾î ÀÖÁö ¾ÊÀ¸¸é ¹°·Ð ¿ø·¡ÀÇ °´Ã¼°¡ ¸®ÅϵȴÙ. ´ÙÀ½ ¿¹Á¦´Â ³ëÆ®ºÏÀÌ ¾øÀ» °æ¿ì ½Î±¸·Á ³ëÆ®ºÏÀ» ¸¸µé¾î ÁØ´Ù.

 

orelse

....

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "·¹³ëº¸");

          useBook(kim);

          Human lee = new Human(44, "À̽¿ì", null);

          useBook(lee);

     }

    

     static void useBook(Human human) {

          Notebook book = human.book.orElse(new Notebook("½Î±¸·Á"));

          System.out.println("³» ³ëÆ®ºÏ : "  + book.model);

     }

}

½ÇÇà°á°ú

³» ³ëÆ®ºÏ : ·¹³ëº¸

³» ³ëÆ®ºÏ : ½Î±¸·Á

 

orElse´Â ´ëü °´Ã¼¸¦ Àμö¿­¿¡¼­ ¹Ì¸® ¸¸µé±â ¶§¹®¿¡ ¾î·°Å³ª °´Ã¼¸¦ ¸¸µé¾î ³õ°í º»´Ù. ÇÔ¼ö¸¦ È£ÃâÇÏ·Á¸é Àμö¸¦ ¸ÕÀú »ý¼ºÇØ¾ß ÇÏ´Ï ¾î¿ ¼ö ¾ø´Ù. ºñ¾î ÀÖÁö ¾ÊÀ¸¸é Àμö¿­¿¡¼­ ¸¸µç °´Ã¼´Â »ç¿ëµÇÁö ¾Ê°í ¹ö·ÁÁ® ºñÈ¿À²ÀûÀÌ´Ù.

ÀÌ¿¡ ºñÇØ orElseGetÀº °´Ã¼°¡ ¾Æ´Ï¶ó °´Ã¼¸¦ »ý¼ºÇÏ´Â ¶÷´Ù½ÄÀ» Àü´ÞÇÏ¿© ºÒÇÊ¿äÇÒ °æ¿ì ¾Æ¿¹ °´Ã¼¸¦ »ý¼ºÇÏÁö ¾Ê´Â´Ù. orElse´Â °´Ã¼¸¦ ¸¸µé¾î ÁÖ°í ¼±Åà ¿©ºÎ¸¦ °áÁ¤ÇÏÁö¸¸ orElseGetÀº °´Ã¼¸¦ ¸¸µå´Â ¹æ¹ýÀ» °¡¸£ÃÄ ÁÖ°í ½ÇÇàÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ ½áµµ µ¿ÀÏÇÏ´Ù.

 

Notebook book = human.book.orElseGet(() -> new Notebook("½Î±¸·Á"));

 

orElseThrow ¸Þ¼­µå´Â °´Ã¼°¡ ºñ¾î ÀÖÀ» ¶§ ¿¹¿Ü¸¦ ´øÁø´Ù. get ¸Þ¼­µå¿Í µ¿ÀÛÀº ºñ½ÁÇÏÁö¸¸ ¿¹¿ÜÀÇ Á¾·ù¸¦ Àμö·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù.

 

Optional<T> filter(Predicate<T> predicate)

 

filter´Â Àμö·Î Àü´ÞÇÑ ¼­¼úÀÚ·Î °´Ã¼¸¦ Á¡°ËÇÏ¿© Á¶°ÇÀ» ¸¸Á·ÇÏ¸é °´Ã¼¸¦ °¡Áø Optional °´Ã¼¸¦ ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é ºó °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. °´Ã¼°¡ óÀ½ºÎÅÍ ºñ¾î ÀÖ¾ú´Ù¸é ºó °´Ã¼°¡ ¸®ÅϵȴÙ. °´Ã¼°¡ Á¸ÀçÇÏ´ÂÁö¿Í Á¶°ÇÀ» ¸¸Á·ÇÏ´ÂÁö º¸´Â °ÍÀÌ´Ù.

 

optionfilter

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "»ï¼º ¾ÆƼºê");

          useBook(kim);

     }

    

     static void useBook(Human human) {

          human.book.filter(b -> b.model.indexOf("»ï¼º") != -1)

          .ifPresent(b -> System.out.println("»ï¼º ³ëÆ®ºÏ"));

     }

}

½ÇÇà°á°ú

»ï¼º ³ëÆ®ºÏ

 

À̸§ ¹®ÀÚ¿­¿¡ »ï¼ºÀÌ Æ÷ÇԵǾî ÀÖÀ¸¸é »ï¼º ³ëÆ®ºÏÀ̶ó°í Ãâ·ÂÇÑ´Ù. °´Ã¼°¡ nullÀ̰ųª »ï¼ºÀÌ ¾Æ´Ï¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù.

 

<U> Optional<U> map(Function<T, U> mapper)

<U> Optional<U> flatMap(Function<T,Optional<U>> mapper)

 

mapÀº °´Ã¼ÀÇ °ªÀ¸·ÎºÎÅÍ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´Ù¸¥ ŸÀÔÀÇ °ªÀ» ÃßÃâÇÏ¿© ÇüŸ¦ º¯°æÇÑ´Ù. ºó °´Ã¼ÀÌ¸é ¸®ÅϵǴ °ªµµ ºó °´Ã¼ÀÌ´Ù.

 

optionmap

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü", "");

          useBook(kim);

     }

    

     static void useBook(Human human) {

          String model = human.book.map(b -> b.model).orElse("À̸§¾øÀ½");

          System.out.println(model);

     }

}

½ÇÇà°á°ú

À̸§¾øÀ½

 

³ëÆ®ºÏÀ¸·ÎºÎÅÍ ¹®ÀÚ¿­ ŸÀÔÀÇ ¸ðµ¨¸íÀ» ÃßÃâÇϹǷΠ¸®ÅÏ Å¸ÀÔÀº Optional<String>ÀÌ´Ù. orElse ¸Þ¼­µå·Î ÀÌ ¹®ÀÚ¿­ÀÌ ºñ¾î ÀÖÀ¸¸é "À̸§¾øÀ½"À̶ó´Â ¸ðµ¨¸íÀ» ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é À̸§ ¹®ÀÚ¿­À» ±¸ÇÑ´Ù.

24-3-3.¸®´ö¼Ç

¸®´ö¼ÇÀº ½ºÆ®¸²ÀÇ ÁýÇÕÀûÀÎ °ªÀ¸·ÎºÎÅÍ ÇϳªÀÇ ÃÖÁ¾°ªÀ» µµÃâÇÏ´Â ¿¬»êÀÌ´Ù. Çհ質 Æò±Õ µîÀÌ ÁÁÀº ¿¹À̸ç Ä÷º¼Ç¿¡¼­ »Ì¾Æ³¾ ¼ö ÀÖ´Â °¡Àå ÈçÇÏ°í À¯¿ëÇÑ Á¤º¸ÀÌ´Ù.

 

T reduce(T identity, BinaryOperator<T> accumulator)

 

ù ¹ø° Àμö·Î ÃʱⰪÀ» ÁÖ°í µÎ ¹ø° Àμö·Î ´©ÀûÀÚ¸¦ ÁØ´Ù. ´©ÀûÀÚ´Â ÃʱⰪºÎÅÍ ½ÃÀÛÇؼ­ °ªÀ» °è¼Ó ´©ÀûÇÏ¿© ´ÙÀ½ °ªÀ» ¸¸µç´Ù.

 

reduce

class JavaTest {

     public static void main(String[] args) {

          int total = Data.nara.stream()

                   .map(Country::getPopu)

                   .reduce(0, (i,j) -> i+j);

          System.out.println(total);

     }

}

½ÇÇà°á°ú

2198

 

ÀÌ ¿¹Á¦´Â ¸ðµç ±¹°¡ÀÇ ÃÑ Àα¸¼ö¸¦ ±¸ÇÑ´Ù. Á¤¼ö ½ºÆ®¸²À¸·Î ÀüȯÇÑ ÈÄ ÃʱⰪ 0¿¡¼­ ½ÃÀÛÇÏ¿© ´ÙÀ½ ¿ä¼Ò¸¦ ½ÃÀÛ°ª¿¡ °è¼Ó ´©Àû½ÃŲ´Ù. ³»ºÎ¿¡¼­´Â ´ÙÀ½°ú °°Àº ·çÇÁ¸¦ µ¹ °ÍÀÌ´Ù.

 

int sum = 0;

for (int elem : stream) {

     sum = sum + elem;

}

 

sumÀ» ÃʱⰪ 0¿¡¼­ ½ÃÀÛÇؼ­ ½ºÆ®¸²ÀÇ ¿¤¸®¸ÕÆ®¸¦ Çϳª¾¿ ´©Àû½ÃÄÑ Çհ踦 ±¸ÇÑ´Ù. ¶÷´Ù½ÄÀ¸·Î µÎ °ªÀ» ´õÇÏ´Â µ¿ÀÛÀ» ÁöÁ¤Çߴµ¥ ÀÌ µ¿ÀÛÀº ÀÚÁÖ »ç¿ëµÇ¹Ç·Î Integer Ŭ·¡½º¿¡ int sum(int a, int b) Á¤Àû ¸Þ¼­µå·Î ¼±¾ðµÇ¾î ÀÖ´Ù. ¶÷´Ù½Ä ´ë½Å ¸Þ¼­µå ·¹ÆÛ·±½º¸¦ ÁöÁ¤Çصµ È¿°ú´Â °°´Ù.

 

reduce(0, Integer::sum);

 

¸ðµç ¿ä¼ÒÀÇ °öÀ» ±¸ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ µÎ °ªÀ» °öÇÏ´Â ¶÷´Ù½ÄÀ» ÁöÁ¤ÇÑ´Ù. ´©Àû°öÀ̹ǷΠÃʱⰪÀÌ 1À̾î¾ß ÇÑ´Ù´Â Á¡À» À¯ÀÇÇÏÀÚ. ÃʱⰪÀÌ 0ÀÌ¸é ¾î¶² °ªÀ» °öÇصµ °á°ú´Â 0ÀÌ µÇ¾î ¹ö¸°´Ù.

 

reduce(1, (i,j) -> i*j);

 

ÃʱⰪÀÌ ±»ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù¸é ´ÙÀ½ ¹öÀüÀ» »ç¿ëÇÑ´Ù.

 

Optional<T> reduce(BinaryOperator<T> accumulator)

 

¸®ÅÏ°ªÀÌ T°¡ ¾Æ´Ï¶ó Optional<T>¶ó´Â Á¡ÀÌ ´Ù¸£´Ù. ÃʱⰪÀÌ ¾ø°í ½ºÆ®¸²ÀÌ ¿ÏÀüÈ÷ ºñ¾î ÀÖÀ» ¶§´Â ºó °´Ã¼°¡ ¸®ÅϵȴÙ. ´ÙÀ½ Äڵ嵵 µ¿ÀÛÀº °°´Ù.

 

reduce2

class JavaTest {

     public static void main(String[] args) {

          Optional<Integer> total = Data.nara.stream()

                   .map(Country::getPopu)

                   .reduce(Integer::sum);

          System.out.println(total.get());

     }

}

½ÇÇà°á°ú

2198

 

½ºÆ®¸²ÀÌ ºñ¾î ÀÖÁö ¾Ê´Ù´Â °ÍÀ» ÀÌ¹Ì ¾Ë°í ÀÖÀ¸¹Ç·Î get ¸Þ¼­µå·Î Çհ踦 Àоú´Ù. ´ÙÀ½ ¿¹Á¦´Â Àα¸ÀÇ ÃÖ´ë, ÃÖ¼Ò°ªÀ» ã´Â´Ù.

 

reduceminmax

class JavaTest {

     public static void main(String[] args) {

          Optional<Integer> min = Data.nara.stream()

              .map(Country::getPopu)

              .reduce(Integer::min);

          System.out.println(min.get());

          Optional<Integer> max = Data.nara.stream()

              .map(Country::getPopu)

              .reduce(Integer::max);

          System.out.println(max.get());

     }

}

½ÇÇà°á°ú

9

1355

 

Àα¸¼ö¸¸ ÃßÃâÇÑ µÚ Integer::min ÇÔ¼ö·Î ¸®´ö¼ÇÀ» ¼öÇàÇÏ¸é ½ºÆ®¸²À» ¼øȸÇÏ¸ç ±× Áß¿¡ °¡Àå ÀÛÀº °ªÀ» ã¾Æ ¸®ÅÏÇÑ´Ù. Integer::max ´ë½Å ¶÷´Ù½Ä (a,b) -> a > b ? a:b¸¦ ½áµµ °°´Ù. OptionalÀ» ¾²Áö ¾ÊÀ¸·Á¸é ÃʱⰪÀ¸·Î ÃæºÐÈ÷ Å« °ª ¶Ç´Â ÃæºÐÈ÷ ÀÛÀº °ªÀ» ÁÖ¸é µÈ´Ù.

 

reduce(Integer.MAX_VALUE, Integer::min);

reduce(Integer.MIN_VALUE, Integer::max);

 

½ºÆ®¸²ÀÌ ºñ¾î ÀÖÁö ¾Ê´Ù´Â °ÍÀ» È®½ÇÈ÷ ¾Ë°í ÀÖ´Ù¸é ±× Áß¿¡ ÃÖ¼Ò, ÃÖ´ë°ªÀÌ ¹Ýµå½Ã Á¸ÀçÇϹǷΠ±»ÀÌ ÃʱⰪÀ» ÁöÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.

24-3-4.±âº»Çü ½ºÆ®¸²

¼ýÀÚÇü ÇʵåÀÇ Çհ踦 ±¸ÇÏ´Â Äڵ带 ´Ù½Ã º¸¸é mapÀÌ Stream<Integer>¸¦ ¸®ÅÏÇÑ´Ù´Â ¸é¿¡¼­ ³¶ºñ°¡ ÀÖ´Ù.

 

Optional<Integer> total = Data.nara.stream()

     .map(Country::getPopu)

     .reduce(Integer::sum);

 

¿ø·¡ Á¤¼öÇüÀÎ popu Çʵ带 Integer·Î ¹Ú½ÌÇؼ­ ½ºÆ®¸²¿¡ ÀúÀåÇϸç reduce ¸Þ¼­µå ³»ºÎ¿¡¼­ IntegerÀÇ Á¤¼ö°ªÀ» ¾ð¹Ú½ÌÇؼ­ ÀÐÀ¸´Ï ¼º´É¿¡ ºÒ¸®ÇÏ´Ù. ½ºÆ®¸²ÀÌ Å¬¼ö·Ï ÀÌ ¹®Á¦°¡ ½É°¢ÇØÁø´Ù. ±×·¡¼­ ±âº»Çü¿¡ ´ëÇÑ ½ºÆ®¸²ÀÌ º°µµ·Î Á¦°øµÈ´Ù.

 

IntStream mapToInt(ToIntFunction<? super T> mapper)

LongStream mapToLong(ToLongFunction<? super T> mapper)

DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)

 

IntStreamÀº Á¤¼öÇüÀÇ ½ºÆ®¸²ÀÌ´Ù. ±âº»ÇüÀÎ int ŸÀÔÀ¸·Î ½ºÆ®¸²À» ÀúÀåÇÏ¸ç ¾ð¹Ú½ÌÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¸®´ö¼ÇÀ» ÇÏÁö ¾Ê°í ¹Ù·Î ÃÖÁ¾°ªÀ» ±¸ÇÏ´Â ¸Þ¼­µåµµ Á¦°øµÈ´Ù.

 

int sum()

OptionalInt max()

OptionalInt min()

OptionalDouble average()

 

sum ¸Þ¼­µå¸¸ È£ÃâÇϸé Á¤¼ö°ªÀÇ Çհ踦 ¹Ù·Î ±¸ÇÒ ¼ö ÀÖ´Ù. ½ºÆ®¸²ÀÌ ºñ¾î ÀÖÀ¸¸é 0ÀÌ ¸®ÅϵȴÙ. ÃÖ´ë, ÃÖ¼Ò, Æò±Õµµ ¹Ù·Î ±¸ÇÒ ¼ö ÀÖµÇ ºó ½ºÆ®¸²¿¡ ´ëÇؼ­´Â Optional<Integer>ÀÇ ±âº»Çü ¹öÀüÀÌ ´ë½Å ¸®ÅϵȴÙ. ½ºÆ®¸²¿¡ ºñÇØ OptionalÀº ¿ä¼Ò°¡ Çϳª¹Û¿¡ ¾ø¾î ±âº»ÇüÀ» ½áµµ ¼º´É Çâ»óÀÌ ´úÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â ±âº»Çü ½ºÆ®¸²À» »ç¿ëÇÏ¿© Àα¸ ÃÑÇÕÀ» ±¸ÇÑ´Ù.

 

maptoint

class JavaTest {

     public static void main(String[] args) {

          int total = Data.nara.stream()

              .mapToInt(Country::getPopu)

              .sum();

          System.out.println(total);

     }

}

½ÇÇà°á°ú

2198

 

mapToInt ¸Þ¼­µå°¡ IntStreamÀ» ¸®ÅÏÇϹǷΠ¹Ú½Ì, ¾ð¹Ú½ÌÇÒ ÇÊ¿ä°¡ ¾ø´Ù. Çհ踦 ±¸ÇÒ ¶§µµ sum ¸Þ¼­µå¸¸ È£ÃâÇÏ¸é µÈ´Ù. sum ¸Þ¼­µå´Â ´ÙÀ½ ÄÚµå¿Í °°´Ù.

 

reduce(0, Integer::sum)

 

´ÙÀ½ µÎ ¸Þ¼­µå´Â ÀÏÁ¤ÇÑ ¹üÀ§ÀÇ Á¤¼ö ½ºÆ®¸²À» »ý¼ºÇÑ´Ù.

 

static IntStream range(int startInclusive, int endExclusive)

static IntStream rangeClosed(int startInclusive, int endInclusive)

 

range ¸Þ¼­µå´Â ³¡°ªÀ» Á¦¿ÜÇϸç rangeClosed´Â ³¡°ªµµ ¹üÀ§¿¡ Æ÷ÇԵȴÙ. 1~100ÀÇ ÇÕ°è´Â ´ÙÀ½°ú °°ÀÌ °£´ÜÈ÷ ±¸ÇÒ ¼ö ÀÖ´Ù.

 

rangeclosed

import java.util.stream.IntStream;

 

class JavaTest {

     public static void main(String[] args) {

          int total = IntStream.rangeClosed(1, 100).sum();

          System.out.println(total);

     }

}

½ÇÇà°á°ú

5050

 

1 ~ 100ÀÇ Á¤¼ö ½ºÆ®¸²À» ¸¸µç ÈÄ sum ¸Þ¼­µå¸¸ È£ÃâÇÏ¸é µÈ´Ù. ¸¸¾à 3ÀÇ ¹è¼ö·Î ±¸¼ºµÈ ½ºÆ®¸²À» ¾òÀ¸·Á¸é ´ÙÀ½ ÇÊÅ͸¦ Áß°£¿¡ ³Ö¾î ÁØ´Ù.

 

.filter(i -> i % 3 == 0)

 

1 ~ 100ÀÇ Á¤¼öÁß 3À¸·Î ³ª´©¾î ¶³¾îÁö´Â ¼ö¸¸ ÃëÇÑ´Ù. ±âº»ÇüÀÌ È®½ÇÈ÷ ¿¬»ê ¼Óµµ´Â ºü¸£´Ù. ´Ù¸¥ Á¦³×¸¯ ¹öÀüÀÇ ¸Þ¼­µå¸¦ »ç¿ëÇÏ·Á¸é ´ÙÀ½ ¸Þ¼­µå·Î Á¦³×¸¯À¸·Î º¹¿øÇÑ´Ù.

 

Stream<Integer> boxed()

 

¼öÄ¡ÀûÀÎ ¿¬»ê¸¸ ÇÒ ¶§´Â ±âº»Çü ½ºÆ®¸²À¸·Î Àá½Ã ÀüȯÇÏ´Â °ÍÀÌ ¼Óµµ»ó À¯¸®ÇÏ´Ù. ªÀº ½ºÆ®¸²Àº º° »ó°ü¾øÁö¸¸ ´ë±Ô¸ðÀÇ ½ºÆ®¸²Àϼö·Ï ¹Ú½Ì, ¾ð¹Ú½Ì ºñ¿ëÀÌ ºñ½Î´Ù.

24-3-5.collect

collect ¸Þ¼­µå´Â ½ºÆ®¸²À¸·ÎºÎÅÍ ÀڷḦ ÃßÃâ ¹× °¡°øÇÏ¿© ´Ù¸¥ ÇüÅ·Πº¯ÇüÇÏ´Â ÃÖÁ¾ ¿¬»êÀÌ´Ù. ÇÔ¼öÀÇ ¿øÇüÀº °£´ÜÇÏ´Ù.

 

<R,A> R collect(Collector<T,A,R> collector)

 

Àμö·Î Collector ÀÎÅÍÆäÀ̽º ±¸Çö °´Ã¼ Çϳª¸¦ Àü´Þ¹Þ¾Æ ÀÌ °´Ã¼ ³»ÀÇ ¸Þ¼­µå¸¦ ¼ø¼­´ë·Î È£ÃâÇÏ¿© ½ºÆ®¸²À» °¡°øÇÑ´Ù. Collector¿¡´Â ´ÙÀ½ Ãß»ó ¸Þ¼­µå°¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

 

Supplier<A> supplier()

BiConsumer<A,T> accumulator()

Function<A,R> finisher()

BinaryOperator<A> combiner()

Set<Collector.Characteristics> characteristics()

 

°¢ ¸Þ¼­µå¿¡ °ø±ÞÀÚ, ´©ÀûÀÚ, Á¾·áÀÚ, °áÇÕÀÚ µîÀÇ À̸§À» ºÙÀÏ ¼ö ÀÖ°í °¢ÀÚ ¸ÃÀº ¿ªÇÒÀÌ ÀÖ´Ù. ÀÌ ¸Þ¼­µåµéÀÌ Á¤È®ÇÏ°Ô ¹«¾ùÀ» ÇÏ°í ¾î¶² ÀÓ¹«¸¦ ¶ì´ÂÁö´Â ·¹ÆÛ·±½º¿¡ Àß ¼³¸íµÇ¾î ÀÖÀ¸¸ç ¸ðµÎ Á¤È®ÇÏ°Ô ±¸ÇöÇØ¾ß Á¦´ë·ÎµÈ Collector °´Ã¼ÀÇ ¿ªÇÒÀ» ¼öÇàÇÑ´Ù.

´ë·«ÀûÀ¸·Î ¼³¸íÇÏÀÚ¸é »õ·Î¿î °á°ú¸¦ ÀúÀåÇϱâ À§ÇÑ ÄÁÅ×À̳ʸ¦ ¸¸µé°í ¿øº» ½ºÆ®¸²¿¡¼­ ¿ä¼Ò¸¦ Àоî ÀÏÁ¤ÇÑ ±ÔÄ¢¿¡ µû¶ó »õ ÄÁÅ×À̳ʿ¡ ÀúÀåÇϸç ÃÖÁ¾ °á°ú¸¦ ¸¸µé¾î ³½´Ù. º´·Ä ó¸®ÇÒ ¶§´Â °¢ ó¸® °á°ú¸¦ º´ÇÕÇØ¾ß ÇÏ¸ç ³»ºÎ µ¿ÀÛÀ» »ó¼¼ÇÏ°Ô Á¤ÀÇÇÏ´Â ¼Ó¼ºµµ ÇÊ¿äÇÏ´Ù.

Collector ÀÎÅÍÆäÀ̽ºÀÇ Å¸ÀÔ ÆĶó¹ÌÅ͸¸ Çصµ 3°³³ª µÇ´Âµ¥ ¿øº» T¿¡¼­ Áß°£ º¯¼ö A¸¦ °ÅÃÄ ¸¶Áö¸· ÃÖÁ¾ °á°úÀÎ RÀ» ¸¸µé¾î³½´Ù. ³»ºÎ°¡ ¾ó¸¶³ª º¹ÀâÇÒÁö´Â °¡È÷ ÁüÀÛÀÌ °¥ °ÍÀÌ´Ù. Collector ÀÎÅÍÆäÀ̽º¸¦ ¿Ïº®È÷ ºÐ¼®Çؼ­ ¿ä°Ç¿¡ ¸Â´Â ¼öÁý °´Ã¼¸¦ ¸¸µå´Â °ÍÀº ½¬¿î ÀÏÀÌ ¾Æ´Ï¸ç »ý»êÀûÀÌÁöµµ ¾Ê´Ù. ÀÚÁÖ »ç¿ëÇÒ¸¸ÇÑ ¼öÁýÀÚ °´Ã¼°¡ Collectors Ŭ·¡½º¿¡ Á¤ÀǵǾî ÀÖÀ¸´Ï ¿ì¸®´Â À̰͸¸ Àß È°¿ëÇصµ ÃæºÐÇÏ´Ù.

 

<T> Collector<T,?,List<T>> toList()

<T> Collector<T,?,Set<T>> toSet()

 

toList´Â T¸¦ ¹Þ¾Æ List<T> °´Ã¼¸¦ »ý¼ºÇÑ´Ù. toSetÀº Áߺ¹À» Á¦°ÅÇÑ Set<T>°´Ã¼¸¦ »ý¼ºÇÑ´Ù. ´õ Á¤È®ÇÏ°Ô Ç¥ÇöÇÏÀÚ¸é ÀÌ·± µ¿ÀÛÀ» ÇÏ´Â Ä÷ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ¿© ½ºÆ®¸²ÀÇ collect ¸Þ¼­µå·Î Àü´ÞÇϸé ÇØ´ç ¼öÁý 󸮸¦ ¼öÇàÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ³ª¶ó ½ºÆ®¸²¿¡¼­ À̸§¸¸ ½ï »©¼­ ¹®ÀÚ¿­ÀÇ ¸®½ºÆ®·Î ¼öÁýÇÑ´Ù.

 

collect

class JavaTest {

     public static void main(String[] args) {

          List<String> names = Data.nara.stream()

              .map(Country::getName)

              .collect(Collectors.toList());

          for (String n : names) {

              System.out.print(n + " ");

          }

     }

}

½ÇÇà°á°ú

Çѱ¹ ¹Ì±¹ Áß±¹ ÇÁ¶û½º ³ªÀÌÁö¸®¾Æ µ¶ÀÏ Çë°¡¸® º£Æ®³² Ä¥·¹ ij³ª´Ù

 

¸ÊÇÎÀ¸·Î ³ª¶ó À̸§¸¸ ÃßÃâÇÑ ÈÄ toList°¡ »ý¼ºÇÑ Ä÷ºÅÍ·Î ³Ñ±â¸é »õ·Î¿î ¹®ÀÚ¿­ ½ºÆ®¸²À» »ý¼ºÇÏ°í ½ºÆ®¸²À» ¼øȸÇÏ¸ç ³ª¶ó À̸§À» Çϳª¾¿ Á¶»çÇÏ¿© ½ºÆ®¸²¿¡ Ãß°¡ÇÑ´Ù. °á°ú·Î ¸®ÅÏµÈ List<String> ŸÀÔ¿¡´Â ³ª¶ó À̸§¸¸ ÀúÀåµÇ¾î ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â CountryÀÇ ¸®½ºÆ®¸¦ »ý¼ºÇÑ´Ù.

 

List<Country> country = Data.nara.stream()

     .collect(Collectors.toList());

for (Country c : country) {

     System.out.println(c.name);

}

 

´ÙÀ½ ¸Þ¼­µå´Â ¸ðµç ¿ä¼Ò¸¦ ¹®ÀÚ¿­ Çϳª·Î Á¶¸³ÇÏ¿© ¸®ÅÏÇÑ´Ù.

 

static Collector<CharSequence,?,String> joining([CharSequence delimiter])

 

±¸ºÐÀÚ¸¦ ÁÖ¸é ¿ä¼Ò Áß°£ Áß°£¿¡ »ðÀԵȴÙ. º¸Åë ÄÞ¸¶·Î ±¸ºÐÇÏ´Â °ÍÀÌ ¹«³­ÇÏ´Ù.

 

collector

class JavaTest {

     public static void main(String[] args) {

          String names = Data.nara.stream()

              .map(Country::getName)

              .collect(Collectors.joining(", "));

          System.out.println(names);

     }

}

½ÇÇà°á°ú

Çѱ¹, ¹Ì±¹, Áß±¹, ÇÁ¶û½º, ³ªÀÌÁö¸®¾Æ, µ¶ÀÏ, Çë°¡¸®, º£Æ®³², Ä¥·¹, ij³ª´Ù

 

³»ºÎÀûÀ¸·Î StringBuilder¸¦ »ç¿ëÇÏ¿© ¿©·¯ °³ÀÇ ¿ä¼Ò¸¦ °áÇÕÇÏ´õ¶óµµ ¼º´É °¨¼Ò´Â ¾ø´Ù. ´ÙÀ½ ¿¹Á¦´Â ½ºÆ®¸²ÀÇ °³¼ö, ÃÖ´ë, ÃÖ¼Ò°ªÀ» ã´Â´Ù.

 

collectminmax

class JavaTest {

     public static void main(String[] args) {

          long num = Data.nara.stream()

              .collect(Collectors.counting());

          System.out.println(num);

          Optional<Integer> max = Data.nara.stream()

                   .map(Country::getPopu)

                   .collect(Collectors.maxBy(Integer::compare));

          System.out.println(max.get());

          Optional<Integer> min = Data.nara.stream()

                   .map(Country::getPopu)

                   .collect(Collectors.minBy(Integer::compare));

          System.out.println(min.get());

     }

}

½ÇÇà°á°ú

10

1355

9

 

´ÙÀ½ ¿¹Á¦´Â Àα¸¼öÀÇ ÇÕ°è¿Í Æò±ÕÀ» ±¸ÇÑ´Ù.

 

collectaverage

class JavaTest {

     public static void main(String[] args) {

          int sum = Data.nara.stream()

              .collect(Collectors.summingInt(Country::getPopu));

          System.out.println(sum);

          double avg = Data.nara.stream()

              .collect(Collectors.averagingInt(Country::getPopu));

          System.out.println(avg);

     }

}

½ÇÇà°á°ú

2198

219.8

 

long°ú double ŸÀÔ¿¡ ´ëÇؼ­µµ summingLong, summingDouble, averagingLong, averagingDouble ¸Þ¼­µå°¡ Á¦°øµÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÇÕ°è, Æò±Õ, ÃÖ´ë, ÃÖ¼Ò°ªÀ» Çѹ濡 ±¸ÇÑ´Ù.

 

summing

class JavaTest {

     public static void main(String[] args) {

          IntSummaryStatistics summary = Data.nara.stream()

              .collect(Collectors.summarizingInt(Country::getPopu));

          System.out.println(summary);

     }

}

½ÇÇà°á°ú

IntSummaryStatistics{count=10, sum=2198, min=9, average=219.800000, max=1355}

 

´ÙÀ½Àº ¸®´ö¼Ç ¿¬»êÀ» ¼öÇàÇÏ´Â ¸Þ¼­µåÀÌ´Ù.

 

static <T> Collector<T,?,T> reducing(T identity, BinaryOperator<T> op)

static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)

static <T,U> Collector<T,?,U> reducing(U identity, Function< T, U> mapper, BinaryOperator<U> op)

 

°£´ÜÇÏ°Ô Çհ踸 ±¸ÇØ º¸ÀÚ. Á¤¼öÇüÀ¸·Î ¸ÊÇÎÇÏÁö ¾Ê°íµµ Á¤¼ö°ªÀ» ÃßÃâÇÏ¿© Çհ踦 ¹Ù·Î ±¸ÇÒ ¼ö ÀÖ´Ù.

 

reducesum

class JavaTest {

     public static void main(String[] args) {

          int sum = Data.nara.stream()

              .collect(Collectors.reducing(0, Country::getPopu, Integer::sum));

          System.out.println(sum);

     }

}

½ÇÇà°á°ú

2198

 

½ºÆ®¸²ÀÇ reduce ¿¬»ê°ú »ç½Ç»ó ºñ½ÁÇÏ°Ô »ç¿ëÇÑ´Ù. ±×·¯³ª º´·ÄÀûÀ¸·Î µ¿ÀÛÇÒ ¼ö ÀÖ°í ½ºÆ®¸²ÀÇ ³»¿ëÀ» º¯°æÇÑ´Ù´Â ¸éÀÌ ´Ù¸£´Ù. °£´ÜÇÑ ¸®´ö¼Ç¿¡´Â reduce ¸Þ¼­µå¸¦ ¾²´Â °ÍÀÌ Æí¸®ÇÏ°í º¹ÀâÇÑ ¸®´ö¼Ç¿¡´Â collect¸¦ ¾´´Ù. ´ÙÀ½Àº ±×·ìÇÎ Ä÷ºÅÍÀÌ´Ù. ÀÏÁ¤ÇÑ ±âÁØ¿¡ µû¶ó ¿ä¼Ò¸¦ ³ª´©¾î ¸ÊÀ» ÀÛ¼ºÇÑ´Ù.

 

static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function< T, K> classifier)

 

Àμö·Î´Â ±×·ìÇο¡ »ç¿ëÇÒ Å°¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Àü´ÞÇÑ´Ù. °¡Àå °£´ÜÇÑ ¹öÀü¸¸ ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

grouping

class JavaTest {

     public static void main(String[] args) {

          Map<Cont, List<Country>> map = Data.nara.stream()

              .collect(Collectors.groupingBy(Country::getCont));

 

          Set<Cont> keys = map.keySet();

          Iterator<Cont> key = keys.iterator();

          while (key.hasNext()) {

              Cont cont = key.next();

              System.out.print(cont + " : ");

              List<Country> n = map.get(cont);

              for (Country c : n) {

                   System.out.print(c.name + " ");

              }

              System.out.println();

          }

     }

}

½ÇÇà°á°ú

AFRICA : ³ªÀÌÁö¸®¾Æ

EUROPE : ÇÁ¶û½º µ¶ÀÏ Çë°¡¸®

AMERICA : ¹Ì±¹ Ä¥·¹ ij³ª´Ù

ASIA : Çѱ¹ Áß±¹ º£Æ®³²

 

±×·ìÇÎÇÒ Å°¸¸ ÁÖ¸é Å°¿Í ¸®½ºÆ®ÀÇ ¸ÊÀ» ¸®ÅÏÇÑ´Ù. ¿¹Á¦¿¡¼­´Â ´ë·úÀ¸·Î ³ª¶ó¸¦ ±×·ìÇÎÇß´Ù. ±×·ìÇÎÀº µü ÇÑ ÁÙ·Î ¿Ï·áµÇÁö¸¸ ÀÌ °á°ú¸¦ Ãâ·ÂÇÏ´Â Äڵ尡 ´õ ±æ´Ù. ºÐÇÒÀº ±×·ìÇÎÀÇ Æ¯¼öÇÑ ¿¹·Î ÁøÀ§Çü¿¡ µû¶ó ±×·ìÀ» ³ª´©´Â °ÍÀÌ´Ù.

 

static <T> Collector<T,?,Map<Boolean,List<T>>> partitioningBy(Predicate<T> predicate)

 

¼­¼úÀÚ¸¦ Àμö·Î ÃëÇØ ÀÌ °ªÀÇ ÁøÀ§ ¿©ºÎ¿¡ µû¶ó ½ºÆ®¸²ÀÇ ¿ä¼Ò¸¦ ºÐÇÒÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â OECD ±¹°¡ ¿©ºÎ¿¡ µû¶ó µÎ °³ÀÇ ±×·ìÀ» ºÐÇÒÇÑ´Ù.

 

oecdgroup

class JavaTest {

     public static void main(String[] args) {

          Map<Boolean, List<Country>> map = Data.nara.stream()

              .collect(Collectors.groupingBy(Country::isOecd));

 

          Set<Boolean> keys = map.keySet();

          Iterator<Boolean> key = keys.iterator();

          while (key.hasNext()) {

              Boolean oecd = key.next();

              System.out.print(oecd + " : ");

              List<Country> n = map.get(oecd);

              for (Country c : n) {

                   System.out.print(c.name + " ");

              }

              System.out.println();

          }

     }

}

½ÇÇà°á°ú

false : Áß±¹ ³ªÀÌÁö¸®¾Æ º£Æ®³²

true : Çѱ¹ ¹Ì±¹ ÇÁ¶û½º µ¶ÀÏ Çë°¡¸® Ä¥·¹ ij³ª´Ù

 

ÀÌ»óÀ¸·Î ½ºÆ®¸²À» ¿¬±¸ÇØ º¸¾Ò´Ù. ¿©±â±îÁöÀÇ ¿¹Á¦¸¦ ±¸°æÇØ º¸¸é SQL ±¸¹®°ú ¸¹ÀÌ Èí»çÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ª°í Àß µ¿ÀÛÇÏÁö¸¸ ³­À̵µ´Â ³ôÀº ÆíÀ̾ ¿¹Á¦ Äڵ常 º¸°í ½ÇÀü¿¡ ¹Ù·Î »ç¿ëÇϱâ´Â ¼ÖÁ÷È÷ ¸¸¸¸Ä¡ ¾Ê´Ù. 2Â÷ ±×·ìÇαîÁö ¼öÇàÇÒ ¼ö ÀÖ´Â ¸Þ¼­µåÀÇ ¿øÇüÀ» º¸ÀÚ. ÀÌ ¸Þ¼­µå´Â ±×·ìÇο¡ »ç¿ëÇÒ Å°¿Í 2Â÷ ±×·ìÇο¡ »ç¿ëÇÒ Ä÷ºÅ͸¦ Àμö·Î ¿ä±¸ÇÑ´Ù.

 

static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)

 

¿øÇü¸¸ ºÁµµ ¾öû³ª°Ô º¹ÀâÇϸç ÁøÂ¥ Å䳪¿Ã Áö°æÀÌ´Ù. ³»ºÎÀûÀ¸·Î »ý¼ºÇÏ´Â Collector °´Ã¼ÀÇ µ¿ÀÛÀ» ¿ÏÀüÈ÷ ²ç°í ÀÖ¾î¾ß¸¸ Á¦´ë·Î ¾µ ¼ö ÀÖ´Ù. ¹è¿ö µÎ¸é À¯¿ëÇÏ°Ô ¾²ÀÌ°ÚÁö¸¸ Áö±Ý ´çÀå °øºÎÇÏ°í ½Í´Ù´Â »ý°¢Àº µéÁö ¾ÊÀ» °ÍÀÌ´Ù. ¼ÖÁ÷È÷ Àú ¸Þ¼­µå¸¦ Á¦´ë·Î ÀÌÇØÇؼ­ ¾²´Â °Íº¸´Ù Ä÷º¼Ç ¿¬»êÀ¸·Î ¸Ç¶¥¿¡ ÇìµùÇÏ´Â°Ô ´õ ¼ÓÆíÇÒÁöµµ ¸ð¸¥´Ù.

½ºÆ®¸²ÀÌ ¸ðµç ¸é¿¡¼­ ÀåÁ¡ÀÌ ¸¹Áö¸¸ ³­À̵µ°¡ ³Ê¹« ³ô°í Àͼ÷ÇÏ°Ô Á¦´ë·Î ¾²´Âµ¥´Â ±²ÀåÈ÷ ¸¹Àº ¿¬½ÀÀÌ ÇÊ¿äÇÏ´Ù. ÇÑ ¹ø¿¡ ½ºÆ®¸²ÀÇ ¸ðµç °ÍÀ» ´Ù ÀÌÇØÇϱâ´Â ¾î·Á¿ì´Ï ´çÀåÀº ±âº»ÀûÀÎ °Í¸¸ ¾²°í °í±Þ ±â¹ýÀº ÇÊ¿äÇÒ ¶§ Á¡ÁøÀûÀ¸·Î ¿¬±¸Çؼ­ Àͼ÷ÇØÁö´Â ÀÛÀüÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.