½ºÆ®¸² ¿¬»êÀº °ªÀ» Á¶ÀÛÇÏ¿© ÃÖÁ¾ °á°ú¸¦ ¸¸µé¾î ³½´Ù. Áß°£¿¡ ¿©·¯
°¡Áö ¿¬»êÀÌ ³¢¾îµé ¼ö ÀÖÁö¸¸ ÃÖÁ¾ÀûÀ¸·Î´Â ¹º°¡ °ªÀ» »êÃâÇØ¾ß Çϸç ÃÖÁ¾ ¿¬»êÀÇ °á°ú´Â ½ºÆ®¸²ÀÌ ¾Æ´Ï¶ó Çհ質 °Ë»ö °á°ú µî ƯÁ¤ ŸÀÔÀÇ °ªÀÌ´Ù. °¡Àå °£´ÜÇÑ ÃÖÁ¾ ¿¬»êÀº ½ºÆ®¸²¿¡ ¼ÓÇÑ ¿ä¼ÒÀÇ °³¼ö¸¦ ±¸ÇÏ´Â 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 ¸Þ¼µå ·¹ÆÛ·±½º¸¦ Àü´ÞÇصµ È¿°ú´Â °°´Ù.
°´Ã¼°¡ ¾ø´Â »óŸ¦ º¸Åë 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 ¸Þ¼µå·Î ÀÌ ¹®ÀÚ¿ÀÌ ºñ¾î ÀÖÀ¸¸é "À̸§¾øÀ½"À̶ó´Â ¸ðµ¨¸íÀ» ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é
À̸§ ¹®ÀÚ¿À» ±¸ÇÑ´Ù.
¸®´ö¼ÇÀº ½ºÆ®¸²ÀÇ ÁýÇÕÀûÀÎ °ªÀ¸·ÎºÎÅÍ ÇϳªÀÇ ÃÖÁ¾°ªÀ» µµÃâÇÏ´Â ¿¬»êÀÌ´Ù. Çհ質
Æò±Õ µîÀÌ ÁÁÀº ¿¹À̸ç Ä÷º¼Ç¿¡¼ »Ì¾Æ³¾ ¼ö ÀÖ´Â °¡Àå ÈçÇÏ°í À¯¿ëÇÑ Á¤º¸ÀÌ´Ù.
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);
½ºÆ®¸²ÀÌ ºñ¾î ÀÖÁö ¾Ê´Ù´Â °ÍÀ» È®½ÇÈ÷ ¾Ë°í ÀÖ´Ù¸é ±× Áß¿¡ ÃÖ¼Ò, ÃÖ´ë°ªÀÌ
¹Ýµå½Ã Á¸ÀçÇϹǷΠ±»ÀÌ ÃʱⰪÀ» ÁöÁ¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
¼ýÀÚÇü ÇʵåÀÇ Çհ踦 ±¸ÇÏ´Â Äڵ带 ´Ù½Ã º¸¸é 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()
¼öÄ¡ÀûÀÎ ¿¬»ê¸¸ ÇÒ ¶§´Â ±âº»Çü ½ºÆ®¸²À¸·Î Àá½Ã ÀüȯÇÏ´Â °ÍÀÌ ¼Óµµ»ó À¯¸®ÇÏ´Ù.
ªÀº ½ºÆ®¸²Àº º° »ó°ü¾øÁö¸¸ ´ë±Ô¸ðÀÇ ½ºÆ®¸²Àϼö·Ï ¹Ú½Ì, ¾ð¹Ú½Ì ºñ¿ëÀÌ ºñ½Î´Ù.
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 °´Ã¼ÀÇ µ¿ÀÛÀ» ¿ÏÀüÈ÷ ²ç°í ÀÖ¾î¾ß¸¸ Á¦´ë·Î ¾µ ¼ö ÀÖ´Ù. ¹è¿ö
µÎ¸é À¯¿ëÇÏ°Ô ¾²ÀÌ°ÚÁö¸¸ Áö±Ý ´çÀå °øºÎÇÏ°í ½Í´Ù´Â »ý°¢Àº µéÁö ¾ÊÀ» °ÍÀÌ´Ù. ¼ÖÁ÷È÷ Àú ¸Þ¼µå¸¦ Á¦´ë·Î
ÀÌÇØÇؼ ¾²´Â °Íº¸´Ù Ä÷º¼Ç ¿¬»êÀ¸·Î ¸Ç¶¥¿¡ ÇìµùÇÏ´Â°Ô ´õ ¼ÓÆíÇÒÁöµµ ¸ð¸¥´Ù.
½ºÆ®¸²ÀÌ ¸ðµç ¸é¿¡¼ ÀåÁ¡ÀÌ ¸¹Áö¸¸ ³À̵µ°¡ ³Ê¹« ³ô°í Àͼ÷ÇÏ°Ô Á¦´ë·Î ¾²´Âµ¥´Â ±²ÀåÈ÷ ¸¹Àº ¿¬½ÀÀÌ ÇÊ¿äÇÏ´Ù. ÇÑ ¹ø¿¡ ½ºÆ®¸²ÀÇ ¸ðµç °ÍÀ» ´Ù ÀÌÇØÇϱâ´Â ¾î·Á¿ì´Ï ´çÀåÀº ±âº»ÀûÀÎ °Í¸¸ ¾²°í °í±Þ ±â¹ýÀº ÇÊ¿äÇÒ ¶§ Á¡ÁøÀûÀ¸·Î
¿¬±¸Çؼ Àͼ÷ÇØÁö´Â ÀÛÀüÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.