沈陽市住房和城鄉(xiāng)建設(shè)部網(wǎng)站手機(jī)優(yōu)化大師官方免費(fèi)下載
Stream流的特點(diǎn)
?中間操作返回的是Stream類型,終結(jié)操作返回的是void
中間操作的這個(gè)Lazy指的是增加待處理操作,而不會(huì)真的處理(放隊(duì)列里),集合中的數(shù)據(jù)并未實(shí)際改變,到終結(jié)操作的時(shí)候才會(huì)把這些放隊(duì)列里的操作批量執(zhí)行
每個(gè)操作都是對應(yīng)一個(gè)函數(shù)式接口,例如
filter方法對應(yīng)的是Predict這個(gè)函數(shù)式接口
forEach對應(yīng)的是Consume這個(gè)函數(shù)式接口
具體哪個(gè)方法對應(yīng)哪個(gè)接口可以到Stream這個(gè)類里去找
?
?獲取流的演示
import java.util.*; import java.util.stream.Stream;public class GetStream {public static void main(String[] args) {//從list獲取streamList<String> list = new ArrayList<>();Stream<String> stream = list.stream();//從set獲取streamSet<String> set = new HashSet<>();Stream<String> stream1 = set.stream();Map<String, String> map = new HashMap<>();//獲取map中的鍵,存儲(chǔ)到一個(gè)Set集合里Set<String> keySet = map.keySet();Stream<String> stream2 = keySet.stream();//獲取map里的值得集合,存儲(chǔ)到一個(gè)Collection集合里Collection<String> values = map.values();Stream<String> stream3 = values.stream();//獲取鍵值對Set<Map.Entry<String, String>> entries = map.entrySet();Stream<Map.Entry<String, String>> stream4 = entries.stream();//把數(shù)組轉(zhuǎn)換為Stream流Integer[] arr = {1, 2, 3, 4, 5};String[] arr2 = {"a", "ab", "abc"};Stream<Integer> arr1 = Stream.of(arr);Stream<String> arr21 = Stream.of(arr2);} }
一個(gè)Stream不管經(jīng)歷過何種操作都不能再次使用
public static void main(String[] args) {Stream<String> stream = Stream.of("張三豐", "張無忌", "張朝陽");Stream<String> stream1 = stream.filter(name -> name.startsWith("張"));//這樣寫是不行的,因?yàn)镾tream屬于管道流,只能被使用一次,不管怎么使用//第一個(gè)Stream流調(diào)用完畢,數(shù)據(jù)就會(huì)被轉(zhuǎn)到下一個(gè)Stream上//而這時(shí)一個(gè)Stream流已經(jīng)使用完畢,就會(huì)關(guān)閉了//所以第一個(gè)stream就不能再調(diào)用了,不然會(huì)出現(xiàn)java.lang.IllegalStateException: stream ????????has already been operated upon or closed//System.out.println(stream.count());stream1.forEach(name-> System.out.println(name)); }
concat
skip
?
?collect函數(shù)
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Stream_collect {public static void main(String[] args) {//創(chuàng)建List集合對象List<String> list = new ArrayList<>();list.add("諸葛亮");list.add("劉備");list.add("關(guān)云長");list.add("張翼德");list.add("趙云");//得到名字為三個(gè)字的流Stream<String> stream = list.stream().filter(s -> s.length() == 3);//把使用Stream流操作完畢的數(shù)據(jù)收集到List集合中遍歷List<String> stringList = stream.collect(Collectors.toList());for(String name : stringList) {System.out.println(name);}//創(chuàng)建一個(gè)Set集合Set<Integer> set = new HashSet<>();set.add(33);set.add(44);set.add(55);set.add(66);//得到大于35的流Stream<Integer> stream1 = set.stream().filter(age -> age > 35);Set<Integer> integerSet = stream1.collect(Collectors.toSet());for(int age : integerSet) {System.out.println(age);}//定義一個(gè)字符串?dāng)?shù)組,每一個(gè)字符串?dāng)?shù)組由姓名和年齡組成String[] strArray = {"劉備,50", "諸葛亮,40", "張飛,40","關(guān)羽,45"};Stream<String> stream2 = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) >= 45);Map<String, Integer> map = stream2.collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1])));Set<String> keySet = map.keySet();for(String key : keySet) {System.out.println(key);}}
}
對應(yīng)運(yùn)行結(jié)果如下:
諸葛亮
關(guān)云長
張翼德
66
55
44
關(guān)羽
劉備