Java 8 Streamæµï¼ææ¡æµå¼ç¼ç¨çç²¾é«
两个ææä»¥åï¼å°±æè¯»è 强çè¦æ±æåä¸ç¯ Java Stream æµçæç« ï¼æè¯´å¸é¢ä¸ä¸æ¯å·²ç»æå¾å¤äºåï¼ç»æä½ ç仿ä¹è¯´ï¼âå°±æ³çä½ åçåï¼âä½ çä½ çï¼å¤ä¹èç½ç忬¢åãé£å°±âåä¸ºå ¶é¾âåä¸ç¯å§ï¼å»å»ã

åä»âStreamâè¿ä¸ªåè¯ä¸æ¥çï¼å®ä¼¼ä¹å java.io å ä¸ç InputStream å OutputStream æäºå ³ç³»ãå®é ä¸å¢ï¼æ²¡æ¯å ³ç³»ãJava 8 æ°å¢ç Stream æ¯ä¸ºäºè§£æ¾ç¨åºåæä½éåï¼Collectionï¼æ¶çç产åï¼ä¹æä»¥è½è§£æ¾ï¼å¾å¤§ä¸é¨ååå å¯ä»¥å½åäºåæ¶åºç°ç Lambda 表达å¼ââæå¤§çæé«äºç¼ç¨æçåç¨åºå¯è¯»æ§ã
Stream ç©¶ç«æ¯ä»ä¹å¢ï¼
Stream 就好åä¸ä¸ªé«çº§çè¿ä»£å¨ï¼ä½åªè½éå䏿¬¡ï¼å°±å¥½å䏿±æ¥æ°´å䏿µï¼å¨æµçè¿ç¨ä¸ï¼å¯¹æµä¸çå ç´ æ§è¡ä¸äºæä½ï¼æ¯å¦âè¿æ»¤æé¿åº¦å¤§äº 10 çå符串âãâè·åæ¯ä¸ªå符串çé¦åæ¯âçã
è¦æ³æä½æµï¼é¦å éè¦æä¸ä¸ªæ°æ®æºï¼å¯ä»¥æ¯æ°ç»æè éåãæ¯æ¬¡æä½é½ä¼è¿åä¸ä¸ªæ°çæµå¯¹è±¡ï¼æ¹ä¾¿è¿è¡é¾å¼æä½ï¼ä½åæçæµå¯¹è±¡ä¼ä¿æä¸åã
æµçæä½å¯ä»¥å为两ç§ç±»åï¼
1ï¼ä¸é´æä½ï¼å¯ä»¥æå¤ä¸ªï¼æ¯æ¬¡è¿åä¸ä¸ªæ°çæµï¼å¯è¿è¡é¾å¼æä½ã
2ï¼ç»ç«¯æä½ï¼åªè½æä¸ä¸ªï¼æ¯æ¬¡æ§è¡å®ï¼è¿ä¸ªæµä¹å°±ç¨å å äºï¼æ æ³æ§è¡ä¸ä¸ä¸ªæä½ï¼å æ¤åªè½æ¾å¨æåã
æ¥ä¸¾ä¸ªä¾åã
List<String> list = new ArrayList<>();
list.add("æ¦æ±å æ²¹");
list.add("ä¸å½å æ²¹");
list.add("ä¸çå æ²¹");
list.add("ä¸çå æ²¹");
long count = list.stream().distinct().count();
System.out.println(count);distinct() æ¹æ³æ¯ä¸ä¸ªä¸é´æä½ï¼å»éï¼ï¼å®ä¼è¿åä¸ä¸ªæ°çæµï¼æ²¡æå
±åå
ç´ ï¼ã
Stream<T> distinct();count() æ¹æ³æ¯ä¸ä¸ªç»ç«¯æä½ï¼è¿åæµä¸çå
ç´ ä¸ªæ°ã
long count();ä¸é´æä½ä¸ä¼ç«å³æ§è¡ï¼åªæçå°ç»ç«¯æä½çæ¶åï¼æµæå¼å§çæ£å°éåï¼ç¨äºæ å°ãè¿æ»¤çãéä¿ç¹è¯´ï¼å°±æ¯ä¸æ¬¡éåæ§è¡å¤ä¸ªæä½ï¼æ§è½å°±å¤§å¤§æé«äºã
ç论é¨åå°±æ¯è¿ä¹å¤ï¼ä¸é¢ç´æ¥è¿å ¥å®æé¨åã
01ãå建æµ
å¦ææ¯æ°ç»çè¯ï¼å¯ä»¥ä½¿ç¨ Arrays.stream() æè
Stream.of() å建æµï¼å¦ææ¯éåçè¯ï¼å¯ä»¥ç´æ¥ä½¿ç¨ stream() æ¹æ³å建æµï¼å ä¸ºè¯¥æ¹æ³å·²ç»æ·»å å° Collection æ¥å£ä¸ã
public class CreateStreamDemo {
public static void main(String[] args) {
String[] arr = new String[]{"æ¦æ±å æ²¹", "ä¸å½å æ²¹", "ä¸çå æ²¹"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("æ¦æ±å æ²¹", "ä¸å½å æ²¹", "ä¸çå æ²¹");
List<String> list = new ArrayList<>();
list.add("æ¦æ±å æ²¹");
list.add("ä¸å½å æ²¹");
list.add("ä¸çå æ²¹");
stream = list.stream();
}
}æ¥ç Stream æºç çè¯ï¼ä½ ä¼åç° of() æ¹æ³å
é¨å
¶å®è°ç¨äº Arrays.stream() æ¹æ³ã
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}å¦å¤ï¼éåè¿å¯ä»¥è°ç¨ parallelStream() æ¹æ³åå»ºå¹¶åæµï¼é»è®¤ä½¿ç¨çæ¯ ForkJoinPool.commonPool()çº¿ç¨æ± ã
List<Long> aList = new ArrayList<>();
Stream<Long> parallelStream = aList.parallelStream();02ãæä½æµ
Stream ç±»æä¾äºå¾å¤æç¨çæä½æµçæ¹æ³ï¼ææ¥æä¸äºå¸¸ç¨çç»ä½ ä»ç»ä¸ä¸ã
1ï¼è¿æ»¤
éè¿ filter() æ¹æ³å¯ä»¥ä»æµä¸çéåºæä»¬æ³è¦çå
ç´ ã
public class FilterStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("卿°ä¼¦");
list.add("çåå®");
list.add("é¶å");
list.add("æä¿æ°");
Stream<String> stream = list.stream().filter(element -> element.contains("ç"));
stream.forEach(System.out::println);
}
}filter() æ¹æ³æ¥æ¶çæ¯ä¸ä¸ª Predicateï¼Java 8 æ°å¢çä¸ä¸ªå½æ°å¼æ¥å£ï¼æ¥åä¸ä¸ªè¾å
¥åæ°è¿åä¸ä¸ªå¸å°å¼ç»æï¼ç±»åçåæ°ï¼å æ¤ï¼æä»¬å¯ä»¥ç´æ¥å°ä¸ä¸ª Lambda 表达å¼ä¼ éç»è¯¥æ¹æ³ï¼æ¯å¦è¯´ element -> element.contains("ç") å°±æ¯çéåºå¸¦æâçâçå符串ã
forEach() æ¹æ³æ¥æ¶çæ¯ä¸ä¸ª Consumerï¼Java 8 æ°å¢çä¸ä¸ªå½æ°å¼æ¥å£ï¼æ¥åä¸ä¸ªè¾å
¥åæ°å¹¶ä¸æ è¿åçæä½ï¼ç±»åçåæ°ï¼ç±»å :: æ¹æ³åæ¯ Java 8 å¼å
¥çæ°è¯æ³ï¼System.out è¿å PrintStream ç±»ï¼println æ¹æ³ä½ åºè¯¥ç¥éæ¯æå°çã
stream.forEach(System.out::println); ç¸å½äºå¨ for 循ç¯ä¸æå°ï¼ç±»ä¼¼äºä¸é¢ç代ç ï¼
for (String s : strs) {
System.out.println(s);
}徿æ¾ï¼ä¸è¡ä»£ç çèµ·æ¥æ´ç®æ´ä¸äºãæ¥çä¸ä¸ç¨åºçè¾åºç»æï¼
çåå®2ï¼æ å°
妿æ³éè¿æç§æä½æä¸ä¸ªæµä¸çå
ç´ è½¬åææ°çæµä¸çå
ç´ ï¼å¯ä»¥ä½¿ç¨ map() æ¹æ³ã
public class MapStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("卿°ä¼¦");
list.add("çåå®");
list.add("é¶å");
list.add("æä¿æ°");
Stream<Integer> stream = list.stream().map(String::length);
stream.forEach(System.out::println);
}
}map() æ¹æ³æ¥æ¶çæ¯ä¸ä¸ª Functionï¼Java 8 æ°å¢çä¸ä¸ªå½æ°å¼æ¥å£ï¼æ¥åä¸ä¸ªè¾å
¥åæ° Tï¼è¿åä¸ä¸ªç»æ Rï¼ç±»åçåæ°ï¼æ¤æ¶åæ° ä¸º String ç±»ç length æ¹æ³ï¼ä¹å°±æ¯æ Stream<String> çæµè½¬æä¸ä¸ª Stream<Integer> çæµã
ç¨åºè¾åºçç»æå¦ä¸æç¤ºï¼
3
3
2
33ï¼å¹é
Stream ç±»æä¾äºä¸ä¸ªæ¹æ³å¯ä¾è¿è¡å ç´ å¹é ï¼å®ä»¬å嫿¯ï¼
anyMatch()ï¼åªè¦æä¸ä¸ªå ç´ å¹é ä¼ å ¥çæ¡ä»¶ï¼å°±è¿å trueãallMatch()ï¼åªææä¸ä¸ªå ç´ ä¸å¹é ä¼ å ¥çæ¡ä»¶ï¼å°±è¿å falseï¼å¦æå ¨é¨å¹é ï¼åè¿å trueãnoneMatch()ï¼åªè¦æä¸ä¸ªå ç´ å¹é ä¼ å ¥çæ¡ä»¶ï¼å°±è¿å falseï¼å¦æå ¨é¨ä¸å¹é ï¼åè¿å trueã
public class MatchStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("卿°ä¼¦");
list.add("çåå®");
list.add("é¶å");
list.add("æä¿æ°");
boolean anyMatchFlag = list.stream().anyMatch(element -> element.contains("ç"));
boolean allMatchFlag = list.stream().allMatch(element -> element.length() > 1);
boolean noneMatchFlag = list.stream().noneMatch(element -> element.endsWith("æ²"));
System.out.println(anyMatchFlag);
System.out.println(allMatchFlag);
System.out.println(noneMatchFlag);
}
}å 为âçåå®â以âçâåå¼å¤´ï¼æä»¥ anyMatchFlag åºè¯¥ä¸º trueï¼å 为â卿°ä¼¦âãâçåå®âãâé¶åâãâæä¿æ°âçå符串é¿åº¦é½å¤§äº 1ï¼æä»¥ allMatchFlag 为 trueï¼å 为 4 个å符串ç»å°¾é½ä¸æ¯âæ²âï¼æä»¥ noneMatchFlag 为 trueã
ç¨åºè¾åºçç»æå¦ä¸æç¤ºï¼
true
true
true4ï¼ç»å
reduce() æ¹æ³ç主è¦ä½ç¨æ¯æ Stream ä¸çå
ç´ ç»åèµ·æ¥ï¼å®æä¸¤ç§ç¨æ³ï¼
Optional<T> reduce(BinaryOperator<T> accumulator)
没æèµ·å§å¼ï¼åªæä¸ä¸ªåæ°ï¼å°±æ¯è¿ç®è§åï¼æ¤æ¶è¿å Optionalã
T reduce(T identity, BinaryOperator<T> accumulator)
æèµ·å§å¼ï¼æè¿ç®è§åï¼ä¸¤ä¸ªåæ°ï¼æ¤æ¶è¿åçç±»ååèµ·å§å¼ç±»åä¸è´ã
æ¥çä¸é¢è¿ä¸ªä¾åã
public class ReduceStreamDemo {
public static void main(String[] args) {
Integer[] ints = {0, 1, 2, 3};
List<Integer> list = Arrays.asList(ints);
Optional<Integer> optional = list.stream().reduce((a, b) -> a + b);
Optional<Integer> optional1 = list.stream().reduce(Integer::sum);
System.out.println(optional.orElse(0));
System.out.println(optional1.orElse(0));
int reduce = list.stream().reduce(6, (a, b) -> a + b);
System.out.println(reduce);
int reduce1 = list.stream().reduce(6, Integer::sum);
System.out.println(reduce1);
}
}è¿ç®è§åå¯ä»¥æ¯ Lambda 表达å¼ï¼æ¯å¦ (a, b) -> a + bï¼ï¼ä¹å¯ä»¥æ¯ç±»å::æ¹æ³åï¼æ¯å¦ Integer::sumï¼ã
ç¨åºè¿è¡çç»æå¦ä¸æç¤ºï¼
6
6
12
120ã1ã2ã3 卿²¡æèµ·å§å¼ç¸å çæ¶åç»æä¸º 6ï¼æèµ·å§å¼ 6 çæ¶åç»æä¸º 12ã
03ãè½¬æ¢æµ
æ¢ç¶å¯ä»¥æéåæè
æ°ç»è½¬ææµï¼é£ä¹ä¹åºè¯¥æå¯¹åºçæ¹æ³ï¼å°æµè½¬æ¢åå»ââcollect() æ¹æ³å°±æ»¡è¶³äºè¿ç§éæ±ã
public class CollectStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("卿°ä¼¦");
list.add("çåå®");
list.add("é¶å");
list.add("æä¿æ°");
String[] strArray = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(strArray));
List<Integer> list1 = list.stream().map(String::length).collect(Collectors.toList());
List<String> list2 = list.stream().collect(Collectors.toCollection(ArrayList::new));
System.out.println(list1);
System.out.println(list2);
String str = list.stream().collect(Collectors.joining(", ")).toString();
System.out.println(str);
}
}toArray() æ¹æ³å¯ä»¥å°æµè½¬æ¢ææ°ç»ï¼ä½ å¯è½æ¯è¾å¥½å¥çæ¯ String[]::newï¼å®æ¯ä»ä¹ä¸ä¸å¢ï¼æ¥çä¸ä¸ toArray() æ¹æ³çæºç ã
<A> A[] toArray(IntFunction<A[]> generator);ä¹å°±æ¯è¯´ String[]::new æ¯ä¸ä¸ª IntFunctionï¼ä¸ä¸ªå¯ä»¥äº§çæéçæ°æ°ç»ç彿°ï¼å¯ä»¥éè¿åç¼è¯åèç ççå®å°åºæ¯ä»ä¹ï¼
String[] strArray = (String[])list.stream().toArray((x$0) -> {
return new String[x$0];
});
System.out.println(Arrays.toString(strArray));ä¹å°±æ¯ç¸å½äºè¿åäºä¸ä¸ªæå®é¿åº¦çå符串æ°ç»ã
彿们éè¦æä¸ä¸ªéåæç
§æç§è§å转æå¦å¤ä¸ä¸ªéåçæ¶åï¼å°±å¯ä»¥é
å¥ä½¿ç¨ map() æ¹æ³å collect() æ¹æ³ã
List<Integer> list1 = list.stream().map(String::length).collect(Collectors.toList());éè¿ stream() æ¹æ³å建éåçæµåï¼åéè¿ map(String:length) å°å
¶æ å°ä¸ºå符串é¿åº¦çä¸ä¸ªæ°æµï¼æåéè¿ collect() æ¹æ³å°å
¶è½¬æ¢ææ°çéåã
Collectors æ¯ä¸ä¸ªæ¶éå¨çå·¥å
·ç±»ï¼å
ç½®äºä¸ç³»åæ¶éå¨å®ç°ï¼æ¯å¦è¯´ toList() æ¹æ³å°å
ç´ æ¶éå°ä¸ä¸ªæ°ç java.util.List ä¸ï¼æ¯å¦è¯´ toCollection() æ¹æ³å°å
ç´ æ¶éå°ä¸ä¸ªæ°ç java.util.ArrayList ä¸ï¼æ¯å¦è¯´ joining() æ¹æ³å°å
ç´ æ¶éå°ä¸ä¸ªå¯ä»¥ç¨åé符æå®çå符串ä¸ã
æ¥çä¸ä¸ç¨åºçè¾åºç»æï¼
[卿°ä¼¦, çåå®, é¶å, æä¿æ°]
[3, 3, 2, 3]
[卿°ä¼¦, çåå®, é¶å, æä¿æ°]
卿°ä¼¦, çåå®, é¶å, æä¿æ°
GitHub 䏿 æ 10000+ ç弿ºç¥è¯åºãäºå¥ç Java è¿é¶ä¹è·¯ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼å¤ªèµäºï¼GitHub 䏿 æ 10000+ ç Java æç¨
å¾®ä¿¡æ æ²é»çäº ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ 222 å³å¯å è´¹é¢åã

