±¾ÎÄÖ÷Òª½éÉÜ
Java 8 µÄÐÂÌØÐÔ£¬°üÀ¨ Lambda ±í´ïʽ¡¢·½·¨ÒýÓá¢Á÷(Stream API)¡¢Ä¬ÈÏ·½·¨¡¢Optional¡¢×éºÏʽÒì²½±à³Ì¡¢ÐµÄʱ¼ä
API£¬µÈµÈ¸÷¸ö·½Ãæ¡£
дÔÚÇ°Ãæ
±¾ÎÄÊÇ¡¶Java 8 in Action¡·µÄ¶ÁÊé±Ê¼Ç£¬Ö÷ÒªÌáÁ¶Á˸ÅÄîÐÔµÄ֪ʶ/¹ÛµãÐԵĽáÂÛ£¬¶ÔÍÆµ¼ºÍ²ûÊÍûÓÐժ¼
ÎÄÖÐÉæ¼°µ½µÄÔ´ÂëÇë²Î¿¼ÎÒÔÚ GitHub ÉϵÄÏîÄ¿ java-learning
(µØÖ·Îª https://github.com/brianway/java-learning )µÄ Java
8 Ä£¿é²¿·Ö£¬±ÈÊéÖвο¼Ô´Âë·ÖÀà¸üÇåÎú
»ù´¡ÖªÊ¶
Java 8 µÄÖ÷ÒªÏë·¨£º
stream API
Ïò·½·¨´«µÝ´úÂëµÄ¼¼ÇÉ(·½·¨ÒýÓá¢Lambda)
½Ó¿ÚÖеÄĬÈÏ·½·¨
Èý¸ö±à³Ì¸ÅÄ
Á÷´¦Àí£¨ºÃ´¦£º¸ü¸ß³éÏó£¬Ãâ·Ñ²¢ÐУ©
ÐÐΪ²ÎÊý»¯£¨Í¨¹ý API À´´«µÝ´úÂ룩
²¢ÐÐÓë¹²ÏíµÄ¿É±äÊý¾Ý
º¯Êýʽ±à³Ì·¶Ê½µÄ»ùʯ£º
ûÓй²ÏíµÄ¿É±äÊý¾Ý
½«·½·¨ºÍº¯Êý¼´´úÂë´«µÝ¸øÆäËü·½·¨µÄÄÜÁ¦
Java 8 ʹÓà Stream API ½â¾öÁËÁ½¸öÎÊÌ⣺
¼¯ºÏ´¦ÀíʱµÄÌ×·ºÍ»Þɬ
ÄÑÒÔÀûÓöàºË
Collection Ö÷ÒªÊÇΪÁË´æ´¢ºÍ·ÃÎÊÊý¾Ý£¬¶ø Stream ÔòÖ÷ÒªÓÃÓÚÃèÊö¶ÔÊý¾ÝµÄ¼ÆËã¡£
ͨ¹ýÐÐΪ²ÎÊý»¯À´´«µÝ´úÂë
ÐÐΪ²ÎÊý»¯£ºÀàËÆÓÚ²ßÂÔÉè¼ÆÄ£Ê½
Àà -> ÄäÃûÀà -> Lambda ±í´ïʽ £¬´úÂëÔ½À´Ô½¼ò½à
Lambda ±í´ïʽ
Lambda ±í´ïʽ£º¼ò½àµØ±íʾ¿É´«µÝµÄÄäÃûº¯ÊýµÄÒ»ÖÖ·½Ê½
ÖØµãÁôÒâÕâËĸö¹Ø¼ü´Ê£ºÄäÃû¡¢º¯Êý¡¢´«µÝ¡¢¼ò½à
Èý¸ö²¿·Ö£º
²ÎÊýÁбí
¼ýÍ·
Lambda Ö÷Ìå
Lambda »ù±¾Óï·¨£¬ÏÂÃæÁ½ÕßÖ®Ò»£º
(parameters) -> expression
(parameters) -> { statements; }
º¯Êýʽ½Ó¿Ú£ºÖ»¶¨ÒåÒ»¸ö ³éÏó·½·¨ µÄ½Ó¿Ú¡£º¯Êýʽ½Ó¿ÚµÄ³éÏó·½·¨µÄÇ©Ãû³ÆÎª º¯ÊýÃèÊö·û
Lambda ±í´ïʽÔÊÐíÄãÒÔÄÚÁªµÄÐÎʽΪº¯Êýʽ½Ó¿ÚµÄ³éÏó·½·¨ÌṩʵÏÖ£¬²¢°ÑÕû¸ö±í´ïʽ×÷Ϊº¯Êýʽ½Ó¿Ú(Ò»¸ö¾ßÌåʵÏÖ)µÄʵÀý¡£
³£Óú¯Êýʽ½Ó¿ÚÓУºPredicate, Consumer, Function, Supplier µÈµÈ¡£
Lambda µÄÀàÐÍÊÇ´ÓʹÓà Lambda µÄÉÏÏÂÎÄÍÆ¶Ï³öÀ´µÄ¡£ÉÏÏÂÎÄÖÐ Lambda ±í´ïʽÐèÒªµÄÀàÐͳÆÎªÄ¿±êÀàÐÍ¡£
·½·¨ÒýÓÃ
·½·¨ÒýÓÃÖ÷ÒªÓÐÈýÀࣺ
(1) Ö¸Ïò¾²Ì¬·½·¨µÄ·½·¨ÒýÓÃ
Lambda: (args) -> ClassName.staticMethod(args)
·½·¨ÒýÓ㺠ClassName::staticMethod
(2) Ö¸ÏòÈÎÒâÀàÐÍʵÀý·½·¨µÄ·½·¨ÒýÓÃ
Lambda: (arg0, rest) -> arg0.instanceMethod(rest)
·½·¨ÒýÓ㺠ClassName.instanceMethod (arg0 ÊÇ ClassName ÀàÐ͵Ä)
(3) Ö¸ÏòÏÖÓжÔÏóµÄʵÀý·½·¨µÄ·½·¨ÒýÓÃ
Lambda: (args) -> expr.instanceMethod(args)
·½·¨ÒýÓ㺠expr::intanceMethod
·½·¨ÒýÓþÍÊÇÌæ´úÄÇЩת·¢²ÎÊýµÄ Lambda ±í´ïʽµÄÓï·¨ÌÇ
Á÷(Stream API)
ÒýÈëµÄÔÒò£º
ÉùÃ÷ÐÔ·½Ê½´¦ÀíÊý¾Ý¼¯ºÏ
͸Ã÷µØ²¢Ðд¦Àí£¬Ìá¸ßÐÔÄÜ
Á÷µÄ¶¨Ò壺´ÓÖ§³ÖÊý¾Ý´¦Àí²Ù×÷µÄÔ´Éú³ÉµÄÔªËØÐòÁÐ
Á½¸öÖØÒªÌØµã£º
Á÷Ë®Ïß
ÄÚ²¿µü´ú
Á÷Ó뼯ºÏ£º
¼¯ºÏÓëÁ÷µÄ²îÒì¾ÍÔÚÓÚʲôʱºò½øÐмÆËã
¼¯ºÏÊÇÄÚ´æÖеÄÊý¾Ý½á¹¹£¬°üº¬Êý¾Ý½á¹¹ÖÐĿǰËùÓеÄÖµ
Á÷µÄÔªËØÔòÊǰ´Ðè¼ÆËã/Éú³É
ÁíÒ»¸ö¹Ø¼üÇø±ðÔÚÓÚ±éÀúÊý¾ÝµÄ·½Ê½
¼¯ºÏʹÓà Collection ½Ó¿Ú£¬ÐèÒªÓû§È¥×öµü´ú£¬³ÆÎªÍⲿµü´ú
Á÷µÄ Streams ¿âʹÓÃÄÚ²¿µü´ú
Á÷²Ù×÷Ö÷Òª·ÖΪÁ½´óÀࣺ
Öмä²Ù×÷£º¿ÉÒÔÁ¬½ÓÆðÀ´µÄÁ÷²Ù×÷
Öն˲Ù×÷£º¹Ø±ÕÁ÷µÄ²Ù×÷£¬´¥·¢Á÷Ë®ÏßÖ´Ðв¢¹Ø±ÕËü
Á÷µÄʹÓãº
Ò»¸öÊý¾ÝÔ´£¨È缯ºÏ£©À´Ö´ÐÐÒ»¸ö²éѯ£»
Ò»¸öÖмä²Ù×÷Á´£¬ÐγÉÒ»ÌõÁ÷µÄÁ÷Ë®Ïߣ»
Ò»¸öÖն˲Ù×÷£¬Ö´ÐÐÁ÷Ë®Ïߣ¬²¢ÄÜÉú³É½á¹û¡£
Á÷µÄÁ÷Ë®Ïß±³ºóµÄÀíÄîÀàËÆÓÚ¹¹½¨Æ÷ģʽ¡£³£¼ûµÄÖмä²Ù×÷ÓÐ filter , map , limit , sorted,
distinct £»³£¼ûµÄÖն˲Ù×÷ÓÐ forEach , count , collect ¡£
ʹÓÃÁ÷
ɸѡ
ν´Êɸѡ£ºfilter
ɸѡ»¥ÒìµÄÔªËØ£ºdistinct
ºöÂÔÍ·¼¸¸öÔªËØ£ºlimit
½Ø¶ÌÖÁÖ¸¶¨³¤¶È£ºskip
Ó³Éä
¶ÔÁ÷ÖÐÿ¸öÔªËØÓ¦Óú¯Êý£ºmap
Á÷µÄ±âƽ»¯£ºflatMap
²éÕÒºÍÆ¥Åä
¼ì²éν´ÊÊÇ·ñÖÁÉÙÆ¥ÅäÒ»¸öÔªËØ£ºanyMatch
¼ì²éν´ÊÊÇ·ñÆ¥ÅäËùÓÐÔªËØ£ºallMatch/noneMatch
²éÕÒÔªËØ£ºfindAny
²éÕÒµÚÒ»¸öÔªËØ£ºfindFirst
¹éÔ¼£¨ÕÛµþ£©£º reduce(³õÖµ£¬½áºÏ²Ù×÷)
ÔªËØÇóºÍ
×î´óÖµºÍ×îСֵ
anyMatch , allMatch , noneMatch ¶¼Óõ½Á˶Ì·£» distinct , sorted
ÊÇÓÐ״̬ÇÒÎÞ½çµÄ£¬skip , limit , reduce ÊÇÓÐ״̬ÇÒÓнçµÄ¡£
ÔʼÀàÐÍÁ÷ÌØ»¯£º IntStream , DoubleStream , LongStream £¬±ÜÃâ°µº¬µÄ×°Ïä³É±¾¡£
Ó³Éäµ½ÊýÖµÁ÷£º mapToInt , mapToDouble , mapToLong
ת»»»ØÁ÷¶ÔÏó£º boxed
ĬÈÏÖµ£º OptionalInt , OptionalDouble , OptionalLong
ÊýÖµ·¶Î§£º
range : [Æðʼֵ£¬½áÊøÖµ)
rangeClosed : [Æðʼֵ£¬½áÊøÖµ]
¹¹½¨Á÷
ÓÉÖµ´´½¨Á÷£º Stream.of , Stream.empty
ÓÉÊý×é´´½¨Á÷£º Arrays.stream(Êý×é±äÁ¿)
ÓÉÎļþÉú³ÉÁ÷£º Files.lines
Óɺ¯ÊýÉú³ÉÁ÷£º´´½¨ÎÞÏÞÁ÷£¬
µü´ú£º Stream.iterate
Éú³É£º Stream.generate
ÓÃÁ÷ÊÕ¼¯Êý¾Ý
¶ÔÁ÷µ÷Óà collect ·½·¨½«¶ÔÁ÷ÖеÄÔªËØ´¥·¢¹éÔ¼²Ù×÷£¨ÓÉ Collector À´²ÎÊý»¯£©¡£
Collectors ʵÓÃÀàÌṩÁËÐí¶à¾²Ì¬¹¤³§·½·¨£¬ÓÃÀ´´´½¨³£¼ûÊÕ¼¯Æ÷µÄʵÀý£¬Ö÷ÒªÌṩÈý´ó¹¦ÄÜ£º
½«Á÷ÔªËØ¹éÔ¼ºÍ»ã×ÜΪһ¸öÖµ
ÔªËØ·Ö×é
ÔªËØ·ÖÇø
¹éÔ¼ºÍ»ã×Ü( Collectors ÀàÖеŤ³§·½·¨)£º
ͳ¼Æ¸öÊý£º Collectors.counting
²éÕÒÁ÷ÖÐ×î´óÖµºÍ×îСֵ£º Collectors.maxBy , Collectors.minBy
»ã×Ü£º Collectors.summingInt , Collectors.averagingInt
, summarizingInt / IntSummaryStatistics ¡£»¹ÓжÔÓ¦µÄ long
ºÍ double ÀàÐ͵ĺ¯Êý
Á¬½Ó×Ö·û´®£º joining
¹ãÒåµÄ¹éÔ¼»ã×Ü£º Collectors.reducing(Æðʼֵ£¬Ó³Éä·½·¨£¬¶þÔª½áºÏ) / Collectors.reducing(¶þÔª½áºÏ)
¡£ Collectors.reducing ¹¤³§·½·¨ÊÇËùÓÐÉÏÊöÌØÊâÇé¿öµÄÒ»°ã»¯¡£
collect vs. reduce £¬Á½Õß¶¼ÊÇ Stream ½Ó¿ÚµÄ·½·¨£¬Çø±ðÔÚÓÚ£º
ÓïÒâÎÊÌâ
reduce ·½·¨Ö¼ÔÚ°ÑÁ½¸öÖµ½áºÏÆðÀ´Éú³ÉÒ»¸öÐÂÖµ£¬ÊDz»¿É±äµÄ¹éÔ¼£»
collect ·½·¨Éè¼Æ¾ÍÊÇÒª¸Ä±äÈÝÆ÷£¬´Ó¶øÀÛ»ýÒªÊä³öµÄ½á¹û
ʵ¼ÊÎÊÌâ
ÒÔ´íÎóµÄÓïÒåʹÓà reduce »áµ¼Ö¹éÔ¼¹ý³Ì²»Äܲ¢Ðй¤×÷
·Ö×éºÍ·ÖÇø
·Ö×飺 Collectors.groupingBy
¶à¼¶·Ö×é
°´×ÓÊý×éÊÕ¼¯Êý¾Ý: maxBy
°ÑÊÕ¼¯Æ÷µÄ½á¹ûת»»ÎªÁíÒ»ÖÖ½á¹û collectingAndThen
Óë groupingBy ÁªºÏʹÓÃµÄÆäËûÊÕ¼¯Æ÷Àý×Ó£º summingInt , mapping
·ÖÇø£ºÊÇ·Ö×éµÄÌØÊâÇé¿ö£¬ÓÉÒ»¸öν´Ê×÷Ϊ·ÖÀຯÊý(·ÖÇøº¯Êý)
ÊÕ¼¯Æ÷½Ó¿Ú£ºCollector£¬²¿·ÖÔ´ÂëÈçÏ£º
public interface Collector<T, A, R> { Supplier<A> supplier(); BiConsumer<A, T> accumulator(); Function<A, R> finisher(); BinaryOperator<A> combiner(); Set<Characteristics> characteristics(); } |
ÆäÖÐ T¡¢A¡¢R ·Ö±ðÊÇÁ÷ÖÐÔªËØµÄÀàÐÍ¡¢ÓÃÓÚÀÛ»ý²¿·Ö½á¹ûµÄ¶ÔÏóÀàÐÍ£¬ÒÔ¼° collect ²Ù×÷×îÖÕ½á¹ûµÄÀàÐÍ¡£
½¨Á¢ÐµĽá¹ûÈÝÆ÷£º supplier ·½·¨
½«ÔªËØÌí¼Óµ½½á¹ûÈÝÆ÷£º accumulator ·½·¨£¬ÀÛ¼ÓÆ÷ÊÇÔλ¸üÐÂ
¶Ô½á¹ûÈÝÆ÷Ó¦ÓÃ×îÖÕת»»£º finisher ·½·¨
ºÏ²¢Á½¸ö½á¹ûÈÝÆ÷£º combiner ·½·¨
¶¨ÒåÊÕ¼¯Æ÷µÄÐÐΪ£º characteristics ·½·¨£¬Characteristics °üº¬ UNORDERED
, CONCURRENT, IDENTITY_FINISH
ǰÈý¸ö·½·¨ÒѾ×ãÒÔ¶ÔÁ÷½øÐÐ˳Ðò¹éÔ¼£¬Êµ¼ùÖÐʵÏֻḴÔӵ㣬һÊÇÒòΪÁ÷µÄÑÓ³ÙÐÔÖÊ£¬¶þÊÇÀíÂÛÉÏ¿ÉÄÜÒª½øÐв¢ÐйéÔ¼¡£
Collectors.toList µÄÔ´ÂëʵÏÖ£º
public static <T> Collector<T, ?, List<T>> toList() { return new CollectorImpl<>( (Supplier<List<T>>) ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, CH_ID); } // static final Set<Collector.Characteristics> CH_ID = Collections.unmodifiableSet (EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)); |
²¢ÐÐÁ÷
²¢ÐÐÁ÷¾ÍÊÇÒ»¸ö°ÑÄÚÈݷֳɶà¸öÊý¾Ý¿é£¬²¢Óò»Í¬µÄÏ̷ֱ߳ð´¦Àíÿ¸öÊý¾Ý¿éµÄÁ÷¡£
¹ØÓÚ²¢ÐÐÁ÷µÄ¼¸µã˵Ã÷£º
Ñ¡ÔñÊʵ±µÄÊý¾Ý½á¹¹ÍùÍù±È²¢Ðл¯Ëã·¨¸üÖØÒª£¬±ÈÈç±ÜÃâ²ðÏä×°ÏäµÄ¿ªÏú£¬Ê¹ÓñãÓÚ²ð·ÖµÄ·½·¨¶ø·Ç iterate¡£
ͬʱ£¬Òª±£Ö¤ÔÚÄÚºËÖв¢ÐÐÖ´Ðй¤×÷µÄʱ¼ä±ÈÔÚÄÚºËÖ®¼ä´«ÊäÊý¾ÝµÄʱ¼ä³¤¡£
ʹÓò¢ÐÐÁ÷ʱҪעÒâ±ÜÃâ¹²Ïí¿É±ä״̬¡£
²¢ÐÐÁ÷±³ºóʹÓõĻù´¡¼Ü¹¹ÊÇ Java 7 ÖÐÒýÈëµÄ·ÖÖ§/ºÏ²¢¿ò¼Ü¡£
·ÖÖ§/ºÏ²¢¿ò¼Ü
·ÖÖ§/ºÏ²¢¿ò¼ÜµÄÄ¿µÄÊÇÒԵݹéµÄ·½Ê½½«¿ÉÒÔ²¢ÐеÄÈÎÎñ²ð·Ö³É¸üСµÄÈÎÎñ£¬È»ºó½«Ã¿¸ö×ÓÈÎÎñµÄ½á¹ûºÏ²¢ÆðÀ´Éú³ÉÕûÌå½á¹û¡£
RecursiveTast<R> ÓÐÒ»¸ö³éÏó·½·¨ compute£¬¸Ã·½·¨Í¬Ê±¶¨ÒåÁË£º
½«ÈÎÎñ²ð·Ö³É×ÓÈÎÎñµÄÂß¼
ÎÞ·¨/²»·½±ãÔÙ²ð·Öʱ£¬Éú³Éµ¥¸ö×ÓÈÎÎñ½á¹ûµÄÂß¼
¶ÔÈÎÎñµ÷Óà fork ·½·¨¿ÉÒÔ°ÑËüÅŽø ForkJoinPool£¬Í¬Ê±¶Ô×ó±ßºÍÓұߵÄ×ÓÈÎÎñµ÷Óà fork
µÄЧÂÊÒª±ÈÖ±½Ó¶ÔÆäÖÐÒ»¸öµ÷Óà compute µÍ£¬ÒòΪ¿ÉÒÔÆäÖÐÒ»¸ö×ÓÈÎÎñ¿ÉÒÔÖØÓÃͬһỊ̈߳¬¼õÉÙ¿ªÏú
¹¤×÷ÇÔÈ¡£ºÓÃÓÚ³ØÖеŤ×÷Ïß³ÌÖ®¼äÖØÐ·ÖÅäºÍƽºâÈÎÎñ¡£
Spliterator ´ú±í¡°¿É·Öµü´úÆ÷¡±£¬ÓÃÓÚ±éÀúÊý¾ÝÔ´ÖеÄÔªËØ¡£¿ÉÒÔÑӳٰ󶨡£
¸ßЧ Java 8 ±à³Ì
ÖØ¹¹¡¢²âÊÔ¡¢µ÷ÊÔ
¸ÄÉÆ´úÂëµÄ¿É¶ÁÐÔ
Óà Lambda ±í´ïʽȡ´úÄäÃûÀà
Ó÷½·¨ÒýÓÃÖØ¹¹ Lambda ±í´ïʽ
Óà Stream API ÖØ¹¹ÃüÁîʽµÄÊý¾Ý´¦Àí
Ôö¼Ó´úÂëµÄÁé»îÐÔ
²ÉÓú¯Êý½Ó¿Ú
ÓÐÌõ¼þµÄÑÓ³ÙÖ´ÐÐ
»·ÈÆÖ´ÐÐ
ʹÓà Lambda ÖØ¹¹ÃæÏò¶ÔÏóµÄÉè¼ÆÄ£Ê½£º
²ßÂÔģʽ
Ò»¸ö´ú±íij¸öËã·¨µÄ½Ó¿Ú
Ò»¸ö»ò¶à¸ö¸Ã½Ó¿ÚµÄ¾ßÌåʵÏÖ£¬ËüÃÇ´ú±íµÄËã·¨µÄ¶àÖÖʵÏÖ
Ò»¸ö»ò¶à¸öʹÓòßÂÔ¶ÔÏóµÄ¿Í»§
Ä£°æ·½·¨
´«Í³£º¼Ì³Ð³éÏóÀ࣬ʵÏÖ³éÏó·½·¨
Lambda£ºÌí¼ÓÒ»¸ö²ÎÊý£¬Ö±½Ó²åÈ벻ͬµÄÐÐΪ£¬ÎÞÐè¼Ì³Ð
¹Û²ìÕßģʽ
Ö´ÐÐÂß¼½Ï¼òµ¥Ê±£¬¿ÉÒÔÓà Lambda ±í´ïʽ´úÌæÀà
ÔðÈÎÁ´Ä£Ê½
¹¤³§Ä£Ê½
´«Í³£ºswitch case »òÕß ·´Éä
Lambda£º´´½¨Ò»¸ö Map£¬½«Ãû³ÆÓ³Éäµ½¶ÔÓ¦µÄ¹¹Ô캯Êý
µ÷ÊԵķ½·¨£º
²é¿´Õ»¸ú×Ù£ºÎÞÂÛ Lambda ±í´ïʽ»¹ÊÇ·½·¨ÒýÓ㬶¼ÎÞ·¨ÏÔʾ·½·¨Ãû£¬½ÏÄѵ÷ÊÔ
Êä³öÈÕÖ¾£º peek ·½·¨£¬Éè¼Æ³õÖÔ¾ÍÊÇÔÚÁ÷µÄÿ¸öÔªËØ»Ö¸´ÔËÐÐ֮ǰ£¬²åÈëÖ´ÐÐÒ»¸ö¶¯×÷
ĬÈÏ·½·¨
Java 8 ÖеĽӿÚÏÖÔÚÖ§³ÖÔÚÉùÃ÷·½·¨µÄͬʱÌṩʵÏÖ£¬Í¨¹ýÒÔÏÂÁ½ÖÖ·½Ê½¿ÉÒÔÍê³É£º
Java 8 ÔÊÐíÔÚ½Ó¿ÚÄÚÉùÃ÷ ¾²Ì¬·½·¨
Java 8 ÒýÈëÁËÒ»¸öй¦ÄÜ£ºÄ¬ÈÏ·½·¨
ĬÈÏ·½·¨µÄÒýÈë¾ÍÊÇΪÁËÒÔ¼æÈݵķ½Ê½½â¾öÏñ Java API ÕâÑùµÄÀà¿âµÄÑݽøÎÊÌâµÄ¡£ËüÈÃÀà¿ÉÒÔ×Ô¶¯µØ¼Ì³Ð½Ó¿ÚµÄÒ»¸öĬÈÏʵÏÖ¡£
Ïò½Ó¿ÚÌí¼Óз½·¨ÊÇ ¶þ½øÖƼæÈÝ µÄ£¬¼´Èç¹û²»ÖØÐ±àÒë¸ÃÀ࣬¼´Ê¹²»ÊµÏÖÐµķ½·¨£¬ÏÖÓÐÀàµÄʵÏÖÒÀ¾É¿ÉÒÔÔËÐС£Ä¬ÈÏ·½·¨
ÊÇÒ»ÖÖÒÔ Ô´Âë¼æÈÝ ·½Ê½Ïò½Ó¿ÚÄÚÌí¼ÓʵÏֵķ½·¨¡£
³éÏóÀàºÍ³éÏó½Ó¿ÚµÄÇø±ð£º
Ò»¸öÀàÖ»Äܼ̳ÐÒ»¸ö³éÏóÀ࣬µ«Ò»¸öÀà¿ÉÒÔʵÏÖ¶à¸ö½Ó¿Ú
Ò»¸ö³éÏóÀà¿ÉÒÔͨ¹ýʵÀý±äÁ¿±£´æÒ»¸öͨÓÃ״̬£¬¶ø½Ó¿Ú²»ÄÜÓÐʵÀý±äÁ¿
ĬÈÏ·½·¨µÄÁ½ÖÖÓÃÀý£º
¿ÉÑ¡·½·¨£ºÌṩĬÈÏʵÏÖ£¬¼õÉÙ¿Õ·½·¨µÈÎÞЧµÄÄ£°æ´úÂë
ÐÐΪµÄ¶à¼Ì³Ð
ÀàÐ͵Ķà¼Ì³Ð
ÀûÓÃÕý½»·½·¨µÄ¾«¼ò½Ó¿Ú
×éºÏ½Ó¿Ú
Èç¹ûÒ»¸öÀàʹÓÃÏàͬµÄº¯ÊýÇ©Ãû´Ó¶à¸öµØ·½¼Ì³ÐÁË·½·¨£¬½â¾ö³åÍ»µÄÈýÌõ¹æÔò£º
Àà Öеķ½·¨ÓÅÏȼ¶×î¸ß
Èô 1 ÎÞ·¨Åжϣ¬ÄÇô×Ó½Ó¿ÚµÄÓÅÏȼ¶¸ü¸ß£¬¼´ÓÅÏÈÑ¡ÔñÓµÓÐ×î¾ßÌåʵÏÖµÄĬÈÏ·½·¨µÄ½Ó¿Ú
Èô 2 »¹ÎÞ·¨Åжϣ¬ÄÇô¼Ì³ÐÁ˶à¸ö½Ó¿ÚµÄÀà±ØÐëͨ¹ýÏÔʾ¸²¸ÇºÍµ÷ÓÃÆÚÍûµÄ·½·¨£¬ÏÔʾµØÑ¡ÔñʹÓÃÄÄÒ»¸öĬÈÏ·½·¨µÄʵÏÖ¡£
Optional È¡´ú null
null µÄÎÊÌ⣺
´íÎóÖ®Ô´£ºNullPointerException ÎÊÌâ
´úÂëÅòÕÍ£º¸÷ÖÖ null ¼ì²é
×ÔÉíÎÞÒâÒå
ÆÆ»µÁË Java µÄÕÜѧ: null Ö¸Õë
ÔÚ Java ÀàÐÍϵͳÉÏ¿ªÁ˸ö¿Ú×Ó£ºnull ²»ÊôÓÚÈκÎÀàÐÍ
java.util.Optional<T> ¶Ô¿ÉÄÜȱʧµÄÖµ½¨Ä£,ÒýÈëµÄÄ¿µÄ²¢·ÇÊÇÒªÏû³ýÿһ¸ö
null ÒýÓ㬶øÊǰïÖúÄã¸üºÃµØÉè¼Æ³öÆÕÊ浀 API¡£
´´½¨ Optional ¶ÔÏó,Èý¸ö¾²Ì¬¹¤³§·½·¨£º
Optional.empty £º´´½¨¿ÕµÄ Optional ¶ÔÏó
Optional.of £ºÒÀ¾Ý·Ç¿ÕÖµ´´½¨ Optional ¶ÔÏó£¬Èô´«¿ÕÖµ»áÅ× NPE
Optianal.ofNullable £º´´½¨ Optional ¶ÔÏó£¬ÔÊÐí´«¿ÕÖµ
ʹÓà map ´Ó Optional ¶ÔÏóÌáÈ¡ºÍת»»Öµ,Optional µÄ map ·½·¨£º
Èô Optional °üº¬Öµ£¬½«¸ÃÖµ×÷Ϊ²ÎÊý´«µÝ¸ø map£¬¶Ô¸ÃÖµ½øÐÐת»»ºó°ü×°³É Optional
Èô Optional Ϊ¿Õ£¬Ê²Ã´Ò²²»×ö£¬¼´·µ»Ø Optional.empty
ʹÓà flatMap Á´½Ó Optional ¶ÔÏó£º
ÓÉÓÚ Optional µÄ map ·½·¨»á½«×ª»»½á¹ûÉú³É Optional£¬¶ÔÓÚ·µ»ØÖµÒѾΪ Optional
µÄ£¬¾Í»á³öÏÖ Optional<Optional<T>> µÄÇé¿ö¡£Àà±È Stream
API µÄ flatMap£¬Optional µÄ flapMap ¿ÉÒÔ½«Á½²ãµÄ Optional ¶ÔÏóת»»Îªµ¥Ò»µÄ
Optional ¶ÔÏó¡£
¼òµ¥À´Ëµ£¬·µ»ØÖµÊÇ T µÄ£¬¾ÍÓà map ·½·¨£»·µ»ØÖµÊÇ Optional<T> µÄ£¬¾ÍÓÃ
flatMap ·½·¨¡£ÕâÑù¿ÉÒÔʹӳÉäÍê·µ»ØµÄ½á¹û¾ùΪ Optional<T>
²ÎÊýΪ null ʱ£¬»áÓÉ Objects.requireNonNull Å׳ö NPE£»²ÎÊýΪ¿ÕµÄ Optional
¶ÔÏóʱ£¬·µ»Ø Optional.empty
²ÎÊý·Ç null/¿ÕµÄ Optional ¶ÔÏóʱ£¬map ·µ»Ø Optional£»flatMap ·µ»Ø¶ÔÏó±¾Éí
ÔÒò¿ÉÒԲο¼ÕâÁ½¸ö·½·¨µÄÔ´Â룺
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } }
public<U> Optional<U> flatMap(Function<?
super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
} |
ÁíÍ⣬Optional ÀàÉè¼ÆµÄ³õÖÔ½ö½öÊÇÒªÖ§³ÖÄÜ·µ»Ø Optional ¶ÔÏóµÄ·½·¨¡£Éè¼ÆÊ±²¢Î´¿¼Âǽ«Æä×÷ΪÀàµÄ×ֶΣ¬ËùÒÔ²¢Î´ÊµÏÖ
Serializable ½Ó¿Ú¡£
ĬÈÏÐÐΪ¼°½âÒýÓà Optional ¶ÔÏó£º
get() : ·µ»Ø·â×°µÄ±äÁ¿Öµ£¬»òÕßÅ׳ö NoSuchElementException
orElse(T other) : ÌṩĬÈÏÖµ
orElseGet(Supplier<? extends T> other) : orElse
·½·¨µÄÑÓ³Ùµ÷Óðæ
orElseThrow(Supplier<> extends X> exceptionSupplier)
: ÀàËÆ get £¬µ«¿ÉÒÔ¶¨ÖÆÏ£ÍûÅ׳öµÄÒì³£ÀàÐÍ
ifPresent(Consumer<? super T>) : ±äÁ¿´æÔÚʱ¿ÉÒÔÖ´ÐÐÒ»¸ö·½·¨
CompletableFuture:×éºÏʽÒì²½±à³Ì
Future ½Ó¿ÚÓÐÒ»¶¨µÄ¾ÖÏÞÐÔ¡£CompletableFuture ºÍ Future µÄ¹ØÏµ¾Í¸ú Stream
ºÍ Collection µÄ¹ØÏµÒ»Ñù¡£
ͬ²½ API Óë Òì²½ API
ͬ²½ API£ºµ÷Ó÷½ÐèÒªµÈ´ý±»µ÷Ó÷½½áÊøÔËÐУ¬¼´Ê¹Á½ÕßÊÇÔÚ²»Í¬µÄÏß³ÌÖÐÔËÐÐ
Òì²½ API£ºÖ±½Ó·µ»Ø£¬±»µ÷Ó÷½Íê³É֮ǰÊǽ«ÈÎÎñ½»¸øÁíÒ»¸öÏß³ÌÈ¥×ö£¬¸ÃÏ̺߳͵÷Ó÷½ÊÇÒì²½µÄ£¬·µ»Ø·½Ê½ÓÐÈçÏÂÁ½ÖÖ£º
Ҫôͨ¹ý»Øµ÷º¯Êý
ҪôÓɵ÷Ó÷½ÔÙÖ´ÐÐÒ»¸ö¡°µÈ´ý£¬Ö±µ½¼ÆËãÍê³É¡±µÄ·½·¨µ÷ÓÃ
ʹÓù¤³§·½·¨ supplyAsync ´´½¨ CompletableFuture ±È½Ï·½±ã£¬¸Ã·½·¨»áÅ׳ö
CompletableFuture ÄÚ·¢ÉúÎÊÌâµÄÒì³£¡£
´úÂëµÄ×èÈûÎÊÌâµÄ½â¾ö·½°¸¼°ÈçºÎÑ¡Ôñ£º
ʹÓò¢ÐÐÁ÷¶ÔÇëÇó½øÐв¢ÐвÙ×÷£ºÊÊÓÃÓÚ¼ÆËãÃܼ¯Ð͵IJÙ×÷£¬ÇÒûÓÐ I/O £¬´ËÊ±ÍÆ¼öʹÓà Stream ½Ó¿Ú
ʹÓà CompletableFuture ·¢ÆðÒì²½ÇëÇó(¿ÉÒÔʹÓö¨ÖƵÄÖ´ÐÐÆ÷)£ºÈôÉæ¼°µÈ´ý I/O µÄ²Ù×÷£¬Ê¹ÓÃ
CompletableFuture Áé»îÐÔ¸üºÃ
×¢Ò⣬CompletableFuture ÀàÖÐµÄ join ·½·¨ºÍ Future ½Ó¿ÚÖÐµÄ get ÓÐÏàͬµÄº¬Ò壬join
²»Å׳ö¼ì²âÒì³£¡£ÁíÍ⣬ÐèҪʹÓÃÁ½¸ö²»Í¬µÄ Stream Á÷Ë®Ïß¶ø²»ÊÇͬһ¸ö£¬À´±ÜÃâ StreamµÄÑÓ³ÙÌØÐÔÒýÆð˳ÐòÖ´ÐÐ
¹¹Ôìͬ²½ºÍÒì²½²Ù×÷£º
thenApply ·½·¨²»»á×èÈû´úÂëµÄÖ´ÐÐ
thenCompose ·½·¨ÔÊÐíÄã¶ÔÁ½¸öÒì²½²Ù×÷½øÐÐÁ÷Ë®Ïߣ¬µÚÒ»¸ö²Ù×÷Íê³Éʱ£¬½«Æä½á¹û×÷Ϊ²ÎÊý´«µÝ¸øµÚ¶þ¸ö²Ù×÷
thenCombine ·½·¨½«Á½¸öÍêÈ«²»Ïà¸ÉµÄ CompletableFuture ¶ÔÏóµÄ½á¹ûÕûºÏÆðÀ´
µ÷Óà get »òÕß join ·½·¨Ö»»áÔì³É×èÈû£¬ÏìÓ¦ CompletableFuture µÄ completion
ʼþ¿ÉÒÔʵÏÖµÈËùÓÐÊý¾Ý¶¼Í걸֮ºóÔÙ³ÊÏÖ¡£ thenAccept ·½·¨ÔÚÿ¸ö CompletableFuture
ÉÏ×¢²áÒ»¸ö²Ù×÷£¬¸Ã²Ù×÷»áÔÚ CompletableFuture Íê³ÉÖ´ÐкóʹÓÃËüµÄ·µ»ØÖµ£¬¼´ thenAccept
¶¨ÒåÁËÈçºÎ´¦Àí CompletableFuture ·µ»ØµÄ½á¹û£¬Ò»µ© CompletableFuture
¼ÆËãµÃµ½½á¹û£¬Ëü¾Í·µ»ØÒ»¸ö CompletableFuture<Void> ¡£
еÄʱ¼äºÍÈÕÆÚ API
ÔÀ´µÄ java.util.Date ÀàµÄȱÏÝ£º
Õâ¸öÀàÎÞ·¨±íʾÈÕÆÚ£¬Ö»ÄÜÒÔºÁÃëµÄ¾«¶È±íʾʱ¼ä
Ò×ÓÃÐԲÄê·ÝÆðʼ 1900 Ä꣬ÔÂ·Ý´Ó 0 Æðʼ
toString ·½·¨Îóµ¼ÈË£ºÆäʵ²¢²»Ö§³ÖÊ±Çø
Ïà¹ØÀàͬÑùȱÏݺࣺܶ
java.util.Calender ÀàÔ·ÝÒÀ¾É´Ó 0 Æðʼ
ͬʱ´æÔÚ java.util.Date ºÍ java.util.Calender £¬Í½ÌíÀ§»ó
ÓеÄÌØÐÔÖ»ÔÚijһ¸öÀàÌṩ£¬Èç DateFormat ·½·¨
DateFormat ²»ÊÇḬ̈߳²È«µÄ
java.util.Date ºÍ java.util.Calender ¶¼ÊǿɱäµÄ
һЩÐ嵀 API£¨ java.time °ü£©
LocalDate : ¸ÃÀàʵÀýÊÇÒ»¸ö ²»¿É±ä¶ÔÏó £¬Ö»Ìṩ¼òµ¥µÄÈÕÆÚ£¬ ²¢²»º¬µ±ÌìµÄʱ¼äÐÅÏ¢£¬Ò²²»¸½´øÈκκÍÊ±ÇøÏà¹ØµÄÐÅÏ¢
LocalTime : ʱ¼ä(ʱ¡¢·Ö¡¢Ãë)
LocalDateTime : ÊÇ LocalDate ºÍ LocalTime µÄºÏÌ壬²»º¬Ê±ÇøÐÅÏ¢
Instant : »úÆ÷µÄÈÕÆÚºÍʱ¼äÔòʹÓà java.time.Instant Àà¶Ôʱ¼ä½¨Ä££¬ÒÔ Unix
ÔªÄêʱ¼ä¿ªÊ¼Ëù¾ÀúµÄÃëÊý½øÐмÆËã
Temporal : ÉÏÃæËĸöÀ඼ʵÏÖÁ˸ýӿڣ¬¸Ã½Ó¿Ú¶¨ÒåÁËÈçºÎ¶ÁÈ¡ºÍ²Ù×ÝΪʱ¼ä½¨Ä£µÄ¶ÔÏóµÄÖµ
Duration : ´´½¨Á½¸ö Temporal ¶ÔÏóÖ®¼äµÄ duration¡£ LocalDateTime
ºÍ Instant ÊÇΪ²»Í¬Ä¿µÄÉè¼ÆµÄ£¬²»ÄÜ»ìÓã¬ÇÒ²»ÄÜ´«µÝ LocalDate µ±²ÎÊý¡£
Period : µÃµ½Á½¸ö LocalDate Ö®¼äµÄʱ³¤
LocalDate £¬ LocalTime £¬ LocalDateTime Èý¸öÀàµÄʵÀý´´½¨¶¼ÓÐÈýÖÖ¹¤³§·½·¨£º
of , parse , now
Duration £¬ Period Óкܶ๤³§·½·¨£º between , of ,»¹ÓÐ ofArribute
Ö®ÀàµÄ
ÒÔÉÏÈÕÆÚ£Ê±¼ä¶ÔÏó¶¼ÊDz»¿ÉÐ޸ĵģ¬ÕâÊÇΪÁ˸üºÃµØÖ§³Öº¯Êýʽ±à³Ì£¬È·±£Ḭ̈߳²È«
²Ù×Ýʱ¼ä£º
withArribute ´´½¨Ò»¸ö¶ÔÏóµÄ¸±±¾£¬²¢°´ÕÕÐèÒªÐÞ¸ÄËüµÄÊôÐÔ¡£¸üÒ»°ãµØ£¬ with ·½·¨¡£µ«×¢Ò⣬
¸Ã·½·¨²¢²»ÊÇÐÞ¸ÄÔÖµ£¬¶øÊÇ·µ»ØÒ»¸öеÄʵÀý ¡£ÀàËÆµÄ·½·¨»¹ÓÐ plus , minusµÈ
ʹÓà TemporalAdjuster ½Ó¿Ú: ÓÃÓÚ¶¨ÖÆ»¯´¦ÀíÈÕÆÚ£¬º¯Êýʽ½Ó¿Ú£¬Ö»º¬Ò»¸ö·½·¨ adjustInto
TemporalAdjusters : ¶ÔÓ¦µÄ¹¤¾ßÀ࣬Óкܶà×Ô´øµÄ¹¤³§·½·¨¡££¨Èç¹ûÏëÓà Lamda ±í´ïʽ¶¨Òå
TemporalAdjuster ¶ÔÏó£¬ÍƼöʹÓà TemporalAdjusters ÀàµÄ¾²Ì¬¹¤³§·½·¨
ofDateAdjuster£©
´òÓ¡Êä³ö¼°½âÎöÈÕÆÚ£Ê±¼ä¶ÔÏó£ºÖ÷ÒªÊÇ java.time.format °ü£¬×îÖØÒªµÄÀàÊÇ DateTimeFormatter
À࣬ËùÓиÃÀàµÄʵÀý¶¼ÊÇ Ḭ̈߳²È« µÄ£¬ËùÒÔ¿ÉÒÔµ¥Àý¸ñʽ´´½¨¸ñʽÆ÷ʵÀý¡£
´¦Àí²»Í¬µÄÊ±ÇøºÍÀú·¨Ê¹Óà java.time.ZoneId À࣬¸ÃÀàÎÞ·¨Ð޸ġ£
// ZoneDateTime µÄ×é³É²¿·Ö ZonedDateTime = LocalDateTime + ZoneId = (LocalDate + LocalTime) + ZoneId |
½áÓï
±¾ÎÄÖ÷Òª¶Ô Java 8 ÐÂÌØÐÔÖÐµÄ Lambda ±í´ïʽ¡¢Stream API¡¢Á÷(Stream API)¡¢Ä¬ÈÏ·½·¨¡¢Optional¡¢×éºÏʽÒì²½±à³Ì¡¢ÐµÄʱ¼ä
API£¬µÈ·½Ãæ½øÐÐÁ˼òµ¥µÄ½éÉܺÍÂÞÁУ¬ÖÁÓÚ¸ü·º»¯µÄ¸ÅÄƩÈ纯Êýʽ±à³Ì¡¢Java ÓïÑÔÒÔÍâµÄ¶«Î÷ûÓнéÉÜ¡£µ±È»£¬ºÜ¶àϸ½ÚºÍÉè¼ÆË¼Ï뻹ÐèÒª½øÒ»²½ÔĶÁ¹Ù·½Îĵµ/Ô´Â룬ÔÚʵսÖÐÈ¥Ìå»áºÍÔËÓá£
|