Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java£¸ÐÂÌØÐÔ×ÜÀÀ
 
À´Ô´£ºÖйúÖÇÄÜÓ²¼þ ·¢²¼ÓÚ 2017-4-11
  1697  次浏览      27
 

±¾ÎÄÖ÷Òª½éÉÜ 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 ÓïÑÔÒÔÍâµÄ¶«Î÷ûÓнéÉÜ¡£µ±È»£¬ºÜ¶àϸ½ÚºÍÉè¼ÆË¼Ï뻹ÐèÒª½øÒ»²½ÔĶÁ¹Ù·½Îĵµ/Ô´Â룬ÔÚʵսÖÐÈ¥Ìå»áºÍÔËÓá£

   
1697 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ