----------------------------
JAVA8ÐÂÌØÐÔ-Stream½Ó¿Ú |
----------------------------
* Stream ½Ó¿Ú(¹ûÈ»ÊÇж«Î÷,Á¬Editplus¶¼Ã»±êºìÌáʾ)
* ËüÌṩ´®ÐкͲ¢ÐÐÁ½ÖÖģʽ½øÐлã¾Û²Ù×÷£¬²¢·¢Ä£Ê½Äܹ»³ä·ÖÀûÓöàºË´¦ÀíÆ÷µÄÓÅÊÆ£¬Ê¹Óà fork/join ²¢Ðз½Ê½À´²ð·ÖÈÎÎñºÍ¼ÓËÙ´¦Àí¹ý³Ì¡£
* ͨ³£±àд²¢ÐдúÂëºÜÄѶøÇÒÈÝÒ׳ö´í, µ«Ê¹Óà Stream API ÎÞÐè±àдһÐжàÏ̵߳ĴúÂ룬¾Í¿ÉÒԺܷ½±ãµØÐ´³ö¸ßÐÔÄܵIJ¢·¢³ÌÐò
* Stream µÄÁíÍâÒ»´óÌØµãÊÇ£¬Êý¾ÝÔ´±¾Éí¿ÉÒÔÊÇÎÞÏ޵ġ£
* Ëü²¢·ÇÊÇÊý¾Ý½á¹¹,Ò²²»ÊÇÈÝÆ÷.¶øÊÇÒ»¸ö¹ý³Ì
* Á÷µÄ²Ù×÷·ÖΪÁ½ÖÖ
Intermediate
* Ò»¸öÁ÷¿ÉÒÔºóÃæ¸úËæÁã¸ö»ò¶à¸ö intermediate ²Ù×÷¡£ÆäÄ¿µÄÖ÷ÒªÊÇ´ò¿ªÁ÷£¬×ö³öijÖ̶ֳȵÄÊý¾ÝÓ³Éä/¹ýÂË£¬È»ºó·µ»ØÒ»¸öеÄÁ÷£¬½»¸øÏÂÒ»¸ö²Ù×÷ʹÓá£ÕâÀà²Ù×÷¶¼ÊǶèÐÔ»¯µÄ£¨lazy£©
* ¾ÍÊÇ˵£¬½ö½öµ÷Óõ½ÕâÀà·½·¨£¬²¢Ã»ÓÐÕæÕý¿ªÊ¼Á÷µÄ±éÀú¡£
* ·½·¨
map (mapToInt, flatMap µÈ)¡¢
filter
distinct
sorted
peek
limit
skip
parallel
sequential
unordered
Terminal
* Ò»¸öÁ÷Ö»ÄÜÓÐÒ»¸ö terminal ²Ù×÷£¬µ±Õâ¸ö²Ù×÷Ö´Ðкó£¬Á÷¾Í±»Ê¹Ó᰹⡱ÁË£¬ÎÞ·¨ÔÙ±»²Ù×÷¡£ËùÒÔÕâ±Ø¶¨ÊÇÁ÷µÄ×îºóÒ»¸ö²Ù×÷¡£
* Terminal ²Ù×÷µÄÖ´ÐУ¬²Å»áÕæÕý¿ªÊ¼Á÷µÄ±éÀú£¬²¢ÇÒ»áÉú³ÉÒ»¸ö½á¹û£¬»òÕßÒ»¸ö side effect¡£
* ·½·¨
forEach
forEachOrdered
toArray
reduce
collect
min
max
count
anyMatch
allMatch
noneMatch
findFirst
findAny
iterator
* Èç¹ûÒ»¸öÁ÷µÄ²Ù×÷,ûÓÐ Terminal ,Ôò¸ÃÁ÷ÖеÄÈκΠIntermediate ²Ù×÷¶¼²»»áÖ´ÐÐ
----------------------------
JAVA8ÐÂÌØÐÔ-StreamµÄ»ñµÃ |
----------------------------
1,Collection ×ÓÀà´´½¨
* ×ÓÀàÖ±½Óµ÷ÓÃ stream();·½·¨(³£ÓÃ)
* ×ÓÀàÖ±½Óµ÷Óà parallelStream();·½·¨,¶¨ÒåÔÚ Collection ½Ó¿ÚÖÐµÄ default ·½·¨
2,Êý×é´´½¨
* Arrays.stream(T[] array);
4,Stream ¾²Ì¬·½·¨´´½¨
* Stream integerStream = Stream.of(1,2,3,4,5,6);
5,ÎļþIO´´½¨
* Stream stream = Files.lines(String path,Charset charser);
* ¸ÃÁ÷»á×Ô¶¯¹Ø±Õ
# ´´½¨ÎÞÏÞÁ÷µÄ·½·¨
* Stream str = Stream.generate(Supplier supplier);
* ¸ÃÁ÷ÿ´ÎÖ´ÐÐ foreach ¶¼»áµ÷Óà supplier µÄ get ·½·¨,Ò²¾ÍÊÇ˵¸Ã¹¹½¨·½·¨¿ÉÒÔ´´½¨ÎÞÏÞ´óµÄÁ÷
* Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
* ÏÈ»ñȡһ¸öÎÞÏÞ³¤¶ÈµÄÕýÕûÊý¼¯ºÏµÄStream£¬È»ºóÈ¡³öǰ10¸ö´òÓ¡¡£Ç§Íò¼ÇסʹÓÃlimit·½·¨£¬²»È»»áÎÞÏÞ´òÓ¡ÏÂÈ¥¡£
----------------------------
JAVA8ÐÂÌØÐÔ-Stream½Ó¿Ú·½·¨ |
----------------------------
parallel();
* ÆôÓò¢ÐÐÁ÷
filter (Predicate super T> predicate);
* ÓÃÓÚ¹ýÂË,ɸѡ
map (Function super T, ? extends R> mapper);
* ¶ÔÓÚStreamÖаüº¬µÄÔªËØÊ¹Óøø¶¨µÄת»»º¯Êý½øÐÐת»»²Ù×÷,°ÑËùÓеķµ»ØÖµ,×é³ÉеÄÁ÷
* '´«Èë¸öUser¶ÔÏó(UserÁ÷),ÌáÈ¡ÀïÃæµÄËùÓÐnameÊôÐÔ,ת»»ÎªÒ»¸öStreamµÄÁ÷'
* ÐÂÉú³ÉµÄStreamÖ»°üº¬×ª»»Éú³ÉµÄÔªËØ¡£
flatMap (Function super T, ? extends Stream extends R>> mapper);
* ´«ÈëµÄ¾ÍÊÇÁ÷,
* ºÍmapÀàËÆ£¬²»Í¬µÄÊÇ´«ÈëµÄÔªËØ,¾ÍÊÇÒ»¸öÁ÷
* ˵°×ÁË,¾ÍÊÇ´«ÈëµÄÿһ¸öÁ÷,È»ºóºÏ²¢ÆðÀ´³ÉΪһ¸öÁ÷,·µ»Ø
* ×¢Òâ²ÎÊý¶ÔÏó Function µÄ·µ»ØÖµÊÇ Stream
mapToInt
mapToLong
mapToDouble
* ÕâÈý¸ö¶¼ÊÇÒ»ÑùµÄ,¼ÆËãºóµÄеÄÁ÷ÊÇÖ¸¶¨ÖµÀàÐÍ(IntStream,LongStream,DoubleStream)¿ÉÒÔÃâ³ý×Ô¶¯×°Ïä/²ðÏäµÄ¶îÍâÏûºÄ£»
sorted ();
* Ò²ÊÇÅÅÐò,ÐèÒªÔªËØ×ÔÉíʵÏÖ Comparable ½Ó¿Ú
sorted (Comparator super T> comparator);
* ÅÅÐò,×Ô¶¨Òå Comparator À´Íê³ÉÅÅÐò
peek (Consumer super T> action);
* Éú³ÉÒ»¸ö°üº¬ÔStreamµÄËùÓÐÔªËØµÄÐÂStream£¬Í¬Ê±»áÌṩһ¸öÏû·Ñº¯Êý£¨ConsumerʵÀý£©£¬ÐÂStreamÿ¸öÔªËØ±»Ïû·ÑµÄʱºò¶¼»áÖ´Ðиø¶¨µÄÏû·Ñº¯Êý£»
* ¸ú map µÄÇø±ð¾ÍÊÇ,mapÊÇ´´½¨Ðµķµ»Ø,Õâ¸ö²»·µ»ØÖ±½ÓÔÚÔÀ´µÄÉϸÄ
limit (long maxSize);
* ·µ»ØÁ÷Ç°ÃæµÄ¼¸¸öÔªËØ,Èç¹ûÔStreamÖаüº¬µÄÔªËØ¸öÊýСÓÚN£¬ÄǾͻñÈ¡ÆäËùÓеÄÔªËØ
* Ò²¿ÉÒÔÓÃÔÚ Set ¼¯ºÏµÄÁ÷ÉÏ,ÄÇô½ØÈ¡µ½µÄÁ÷,ÊÇÎÞÐòµÄ
skip (long n);
* ¶ªÆú(Ìø¹ý)Á÷Ç°ÃæµÄ¼¸¸öÔªËØ,Èç¹ûÔStreamÖаüº¬µÄÔªËØ¸öÊýСÓÚN£¬ÄÇô·µ»Ø¿ÕStream£»
forEach (Consumer super T> action);
* ±éÀú,ÔÚ¶àºËÇé¿öÏÂÒ²Ðí»áʧȥ˳Ðò
* Èç¹ûÄãÐèÒª¶àºË±éÀú,ÄÇôÐèÒªµ÷Óà arr.parallelStream().forEach(System.out::println); 'Collection' ½Ó¿ÚµÄĬÈÏ·½·¨
forEachOrdered (Consumer super T> action);
* ͬÉÏ,µ«ÊÇ,'ÔÚ¶àºËÇé¿öÏÂ˳Ðò²»»áÓÐÓ°Ïì'
reduce (T identity, BinaryOperator accumulator);
* µÚÒ»¸ö²ÎÊýÊdzõʼֵ,ºóÃæ Lambda´«µÝÁ©Öµ.±íʾҪ½øÐÐɶ²Ù×÷,µÃµ½É¶½á¹û
* int sum = numbers.stream().reduce(0,(a,b) -> {a + b}); //ÇóÒ»×鼯ºÏÖÐËùÓÐÊý×ֵĺÍ
* Èç¹ûÊÇ parallelStream(); ²¢ÐÐÁ÷µ÷ÓÃÖ´Ðеϰ,´«µÝ¸ø Lambda ±í´ïʽ accumulator µÄÁ©±äÁ¿²»Äܸü¸Ä״̬,¶øÇÒ²Ù×÷±ØÐëÂú×ã½áºÏÂɲſÉÒÔ°´ÈÎÒâ˳ÐòÖ´ÐÐ
reduce ();
* ÉÏÃæµÄÖØÔØ,ÎÞ³õʼֵ
* ·µ»Ø Optional,Òòû³õʼֵ.ÅÂÁ÷ÊǿյÄ
* Optional max = numbers.stream().reduce(Integer::max); //·µ»ØÊý×ÖÁ÷ÖеÄ×î´óÖµ
toArray ();
* ·µ»Ø Object[] Êý×é
findFirst ();
* ÕâÊÇÒ»¸ö termimal ¼æ short-circuiting ²Ù×÷£¬Ëü×ÜÊÇ·µ»Ø Stream µÄµÚÒ»¸öÔªËØ£¬»òÕ߿ա£
findAny
* ͬÉÏ,Ò²ÊÇ·µ»ØµÚÒ»¸öÔªËØ.µ«ÊÇÕâ¸öÅ£±ÆÖ®´¦ÔÚÓÚ,'´¦Àí²¢ÐÐ'.
* Èç¹ûÄã²»½éÒâ·µ»ØµÄÔªËØÊÇÄĸö,¿ÉÒÔʹÓÃÕâ¸ö
distinct ();
* È¥³ýÖØ¸´,»áÒÀÀµhashCodeºÍequals
count ();
* ·µ»ØÁ÷ÖÐÔªËØµÄ¸öÊý
min(Comparator com);
* ¸ù¾Ý±È½ÏÆ÷,»ñÈ¡×îµÄÔªËØ
max(Comparator com);
* ¸ù¾Ý±È½ÏÆ÷,»ñÈ¡×î´óµÄÔªËØ
collect(Collectors.toList());
* °Ñ½á¹û,ת»»ÎªÒ»¸ö¼¯ºÏ
* ½ÓÊÕÒ»¸ö Collectors ½Ó¿ÚµÄʵÏÖ,ÓÃÓÚ°ÑÔªËØÖеÄÄÚÈÝ,½øÐÐÒ»¸ö»ã×Ü
//Æ¥ÅäϵÁеÄAPI
allMatch
* ¼ì²éÊÇ·ñÆ¥ÅäËùÓÐÔªËØ,·µ»Ø boolean
anyMatch
* ¼ì²éÊÇ·ñÖÁÉÙÆ¥ÅäÒ»¸öÔªËØ boolean
noneMath
* ¼ì²éÊÇ·ñδƥÅäÖÐÈκÎÔªËØ boolean
findFirst
* ·µ»ØµÚÒ»¸öÔªËØ
* ·µ»ØÊǵÄÀàÐÍÊÇ Optional
findAny
* ·µ»Øµ±Ç°Á÷ÖеÄÈÎÒâÔªËØ
* ·µ»ØÊǵÄÀàÐÍÊÇ Optional
----------------------------
JAVA8ÐÂÌØÐÔ-»ù±¾Êý¾ÝÀàÐ굀 |
----------------------------
* ¶ÔÓÚ»ù±¾ÊýÖµÐÍ£¬Ä¿Ç°ÓÐÈýÖÖ¶ÔÓ¦µÄ°ü×°ÀàÐÍ Stream£º
IntStream
LongStream
DoubleStream
* µ±È»ÎÒÃÇÒ²¿ÉÒÔÓà Stream¡¢Stream >¡¢Stream£¬µ«ÊDzðÏäºÍ×°Ïä»áºÜºÄʱ£¬ËùÒÔÌØ±ðΪÕâÈýÖÖ»ù±¾ÊýÖµÐÍÌṩÁ˶ÔÓ¦µÄ Stream¡£
* ¶îÍâ·½·¨
min(); //»ñÈ¡Á÷ÖеÄ×îСֵ
max(); //»ñÈ¡Á÷ÖеÄ×î´óÖµ
sum(); //ºÍÖµ
average(); //ƽ¾ùÖµ
boxed(); //ת»»»á Stream Á÷
----------------------------
JAVA8ÐÂÌØÐÔ-ÎÞÏÞÁ÷ |
----------------------------
# µü´ú
Stream.iterate(0, n -> n+2);
* 0 ±íʾ³õʼֵ,È»ºó²»¶ÏµÄ +2
* Ò»°ãÀ´ËµËµ,ÐèÒªÒÀ´ÎÉú³ÉһϵÁÐÖµµÄʱºò¾ÍÓ¦¸ÃÓÃÕâ¸ö
# Éú³É
Stream str = Stream.generate(Supplier supplier);
* ¸ÃÁ÷ÿ´ÎÖ´ÐÐ foreach ¶¼»áµ÷Óà supplier µÄ get ·½·¨,Ò²¾ÍÊÇ˵¸Ã¹¹½¨·½·¨¿ÉÒÔ´´½¨ÎÞÏÞ´óµÄÁ÷
----------------------------
JAVA8ÐÂÌØÐÔ-Á÷µÄ״̬ |
----------------------------
# ÎÞ״̬
# ÓÐ״̬ -> Óнç
# ÓÐ״̬ -> ÎÞ½ç
----------------------------
JAVA8ÐÂÌØÐÔ-²¢ÐÐÁ÷ |
----------------------------
# ¶àÏ̵߳ÄÁ÷
* ͨ¹ý parallelStream(); ¿ÉÒÔ»ñÈ¡¶àÏ̵߳ÄÁ÷
list.parallelStream().forEach(System.out::println); //¶àÏ̴߳òÓ¡,˳Ðò»áÓÐÓ°Ïì
* Á÷Ö±½Óµ÷Óà parallel(); ·½·¨
Stream stream = Stream.of("1","2","4").parallel();
# ¹Ø±Õ²¢ÐÐÁ÷
sequential();
----------------------------
JAVA8ÐÂÌØÐÔ-×ܽá |
----------------------------
# Á÷µÄ´´½¨,ÎÞÏÞÁ÷µÄ´´½¨
* list.stream(); //Collection ·½·¨
* Stream.of(1,2,3,4,5,6);
* Stream.generate(Supplier supplier);
* Arrays.stream(T[] array);
# Á÷µÄ²Ù×÷·½Ê½,Á½ÖÖ
* ¹ý³Ì
* ½á¹û
# ¶àÏ̵߳ÄÁ÷
* ͨ¹ý parallelStream(); ¿ÉÒÔ»ñÈ¡¶àÏ̵߳ÄÁ÷
list.parallelStream().forEach(System.out::println); //¶àÏ̴߳òÓ¡,˳Ðò»áÓÐÓ°Ïì
* Á÷Ö±½Óµ÷Óà parallel(); ·½·¨
Stream stream = Stream.of("1","2","4").parallel();
# ÎÞÏÞÁ÷
----------------------------
JAVA8ÐÂÌØÐÔ-collector |
----------------------------
# ÊÇÒ»¸ö½Ó¿Ú,ÊÕ¼¯Æ÷,ÔÚÁ÷ÖÐʹÓÃAPI:collect(Collector collecto);
# Ô¤¶¨ÒåµÄÊÕ¼¯Æ÷
Collectors.toList()
* °Ñ½á¹ûת»»ÎªÒ»¸ö¼¯ºÏ
Collectors.toSet();
* °Ñ½á¹ûת»»ÎªÒ»¸öSet
Collectors.toCollection(Supplier collectionFactory);
* ת»»Îª×Ô¶¨ÒåµÄ Collection ½Ó¿ÚʵÏÖ
* ¾ÍÊÇ¿ÉÒÔʹÓÃ×Ô¼º´´½¨ÈÝÆ÷
* collect(Collectors.toCollection(HashSet::new));
Collectors.counting();
* ·µ»Ø lang,°Ñ½á¹ûÊÕ¼¯ÎªÒ»¸ö×ÜÊý
Collectors.averagingInt();
Collectors.averagingLong();
Collectors.averagingDouble();
* ÒÔÉÏÈý,¶¼ÊDz»Í¬Êý¾ÝÀàÐÍµÄÆ½¾ùÖµ
Collectors.summarizingInt();
Collectors.summarizingLong();
Collectors.summarizingDouble();
* ÒÔÉÏÈý,¶¼ÊDz»Í¬Êý¾ÝÀàÐ͵ĺÍ
* ·µ»Ø
Collectors.maxBy(Comparator super T> comparator);
* ¸ù¾Ý±È½ÏÆ÷,»ñÈ¡×î´óÖµ
Collectors.minBy(Comparator super T> comparator);
* ¸ù¾Ý±È½ÏÆ÷,»ñÈ¡×îСֵ
Collectors.groupingBy(Function super T, ? extends K> classifier);
* ·Ö×é,·µ»Ø Map,LambdaµÄ·µ»ØÖµ,»á×÷ΪMapµÄkey
* Demo
Map> = users.stream().collect(Collectors.groupingBy(item -> {
return user.getAge() > 20 ? "ÖÐÄê" : "ÇàÄê";
}));
Collectors.groupingBy(Function function,Collector collector);
* ÏȰ´ÕÕ Function µÄ·µ»ØÖµ½øÐзÖ×é
* ÔÙ°Ñ·Ö×éµÄ½á¹û,½øÐÐ collector ÊÕ¼¯²Ù×÷
* Demo //ÏȰ´ÐÔ±ð·Ö×é,ÔÙ°´ÄêÁä·Ö×é
Map>> = users.stream().collect(
Collectors.groupingBy(User:getSex, Collectors.groupingBy((user) - > {
return user.getAge() > 20 ? "ÖÐÄê" : "ÇàÄê";
}));
Collectors.joining();
* Á¬½Ó²Ù×÷,×Ö·û´®Á¬½Ó.ûÓÐÈκÎÖмä·ûºÅ
* Demo
String namesss = users.stream()
.map(User:getName);
.collect(Collectors.joining());
Collectors.joining(String a,String b,String c);
* ͬÉÏ,²»¹ý»áÔÚÁ¬½ÓµÄ¿ªÍ·¼ÓÉÏ b,½áβ¼ÓÉÏ c,ÿ¸öÁ¬½ÓµãÖ®¼ä¼ÓÉÏ a