目錄
一、Stream流終結操作方法
二、Stream流的收集操作
三、Stream流綜合練習
一、Stream流終結操作方法
概念:終結操作的意思,就是執行完此方法之後,Stream流将不能再執行其他操作
常見方法:
方法名 | 說明 |
void forEach(Consume action) | 對此流的每個元素執行操作 |
long count() | 傳回此流中的元素數 |
代碼示範:
public class StreamDemo {
public static void main(String[] args) {
//建立一個集合,存儲多個字元串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林值瓦");
list.add("張無極");
list.add("王天涯");
list.add("柳梅");
list.add("張望");
list.add("張啟天");
//需求1:把集合中的元素在控制台輸出
list.stream().forEach(System.out::println);
//需求2:統計集合中有幾個以張開頭的元素,并把統計結果在控制台輸出
long count = list.stream().filter(s -> s.startsWith("張")).count();
System.out.println(count);
}
}
二、Stream流的收集操作
概念:對資料使用Stream流的方式操作完畢後,可以把流中的資料收集到集合中
常用方法:
方法名 | 說明 |
R collect(Collector collector) | 把結果收集到集合中 |
工具類Collectors提供了具體的收集方式:
方法名 | 說明 |
public static Collector toList() | 把元素收集到List集合中 |
public static Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper,Function valueMapper) | 把元素收集到Map集合中 |
代碼示範:
public class CollectDemo {
public static void main(String[] args) {
//建立List集合對象
List<String> list = new ArrayList<String>();
list.add("孫悟空");
list.add("孫行者");
list.add("王寶強");
list.add("柳神");
//需求1:得到名字為3個字的流
Stream<String> listStream = list.stream().filter(s -> s.length() == 3);
//需求2:把使用Stream流操作完畢的資料收集到List集合中并周遊
List<String> names = listStream.collect(Collectors.toList());
for(String name : names) {
System.out.println(name);
}
//建立Set集合對象
Set<Integer> set = new HashSet<Integer>();
set.add(10);
set.add(20);
set.add(30);
set.add(33);
set.add(35);
//需求3:得到年齡大于25的流
Stream<Integer> setStream = set.stream().filter(age -> age > 25);
//需求4:把使用Stream流操作完畢的資料收集到Set集合中并周遊
Set<Integer> ages = setStream.collect(Collectors.toSet());
for(Integer age : ages) {
System.out.println(age);
}
//定義一個字元串數組,每一個字元串資料由姓名資料和年齡資料組合而成
String[] strArray = {"孫悟空,560", "孫行者,555", "王寶強,33", "柳神,22"};
//需求5:得到字元串中年齡資料大于28的流
Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
//需求6:把使用Stream流操作完畢的資料收集到Map集合中并周遊,字元串中的姓名作鍵,年齡作值
Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
Set<String> keySet = map.keySet();
for (String key : keySet) {
Integer value = map.get(key);
System.out.println(key + "," + value);
}
}
}
三、Stream流綜合練習
需求:
現在有兩個ArrayList集合,分别存儲6名男演員名稱和6名女演員名稱,要求完成如下操作:
男演員隻要名字為3個字的前三人
女演員隻要姓林的,并且不要第一個
public class Actor {
private String name;
public Actor(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class StreamTest {
public static void main(String[] args) {
//建立集合
ArrayList<String> manList = new ArrayList<String>();
manList.add("周潤發");
manList.add("成龍");
manList.add("劉德華");
manList.add("吳京");
manList.add("周星馳");
manList.add("李連傑");
ArrayList<String> womanList = new ArrayList<String>();
womanList.add("林心如");
womanList.add("張曼玉");
womanList.add("林青霞");
womanList.add("柳岩");
womanList.add("林志玲");
womanList.add("王祖賢");
//男演員隻要名字為3個字的前三人
Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);
//女演員隻要姓林的,并且不要第一個
Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
//把過濾後的男演員姓名和女演員姓名合并到一起
Stream<String> stream = Stream.concat(manStream, womanStream);
//把上一步操作後的元素作為構造方法的參數建立演員對象,周遊資料
// stream.map(Actor::new).forEach(System.out::println);
stream.map(Actor::new).forEach(p -> System.out.println(p.getName()));
//把以上操作聯合在一起
Stream.concat(manList.stream().filter(s -> s.length() == 3).limit(3), womanList
.stream().filter(s -> s.startsWith("林")).skip(1)).map(Actor::new)
.forEach(p -> System.out.println(p.getName()));
}
}