1、兩種獲取Stream流的方式
java.util.stream.Stream<T> 是java 8 加入的最常用的流接口,這并不是一個(gè)函數(shù)式接口
獲取流兩種方式:
1、所有Collection 集合(單列集合)都可以通過stream默認(rèn)方式獲取流
default Stream<E> stream()
2、Stream接口的靜態(tài)方法of可以獲取數(shù)組對(duì)應(yīng)的流
static <T> Stream<T> of (T... values)
參數(shù)是一個(gè)可變參數(shù),就可傳遞一個(gè)數(shù)組
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.*;
import java.util.stream.Stream;
/*
兩種方式獲取流
1、Collection 接口中的方法stream()
2、Stream接口的靜態(tài)方法of:返回單個(gè)元素的序列Stream
static <T> Stream<T> of (T... values)
參數(shù)是一個(gè)可變參數(shù),可傳遞一個(gè)數(shù)組
*/
public class Demo02GetStream {
public static void main(String[] args) {
//把單列集合轉(zhuǎn)換成Stream
List<String> list = new ArrayList();
Stream<String> stream = list.stream();
//Set
Set<String> set = new HashSet<>();
Stream<String> stream1 = set.stream();
Map<String,String> map1 = new HashMap<>();
Set<String> strings = map1.keySet();
Stream<String> stream2 = strings.stream();
Collection<String> values = map1.values();
Stream<String> stream3 = values.stream();
Set<Map.Entry<String, String>> entries = map1.entrySet();
Stream<Map.Entry<String, String>> stream4 = entries.stream();
//把數(shù)組轉(zhuǎn)換成Stream流
Stream<Integer> stream5 = Stream.of(1, 2, 34, 4); //可變參數(shù)
//可變參數(shù)可以傳數(shù)組
int[] arr = {1,3,4,5};
Stream<int[]> stream6 = Stream.of(arr);
String[] arr2 = {"a","fff","fs"};
Stream<String> stream7 = Stream.of(arr2);
}
}
2、Stream 流中的常用方法-forEach

常用方法

forEach
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
/*
void forEach(Consumer<? super T> action);
該方法接收一個(gè)Consumer函數(shù)接口,會(huì)將每一個(gè)流元素交給該函數(shù)進(jìn)行處理
Consumer 是一個(gè)消費(fèi)性的函數(shù)式接口,可以傳遞Lambda表達(dá)式
注意:
for each 用來遍歷流中的數(shù)據(jù)
是終結(jié)方法, 遍歷之后不能調(diào)用Stream流中的其他方法
*/
public class Demo02Streamfor {
public static void main(String[] args) {
Stream<String> af = Stream.of("af", "sdkf", "cc", "gg", "hh");
/* af.forEach((String name)->{
System.out.println(name);
});*/
//簡化Lambda表達(dá)式
System.out.println("--------");
af.forEach((name)-> System.out.println(name));
}
}
結(jié)果
af
sdkf
cc
gg
hh
3、Stream 流中的常用方法-filter

filter
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
public class Demo02StreamFilter {
public static void main(String[] args) {
//創(chuàng)建Stream 流
Stream<String> stream = Stream.of("張三豐", "張無極", "張強(qiáng)", "趙敏", "周芷若");
//對(duì)Stream 流中的元素進(jìn)行過濾,只要姓張的, 得到一個(gè)新的流, 接收他
Stream<String> stream2 = stream.filter((String name )->{ return name.startsWith("張");});
stream2.forEach((name)-> System.out.println(name));
}
}
4、Stream 流的特點(diǎn),只能使用一次
Stream流屬于管道流,只能被使用一次
第一個(gè)Stream流調(diào)用完畢方法,數(shù)據(jù)就會(huì)流轉(zhuǎn)到下一個(gè)Stream 上
而這時(shí)第一個(gè)Stream流已經(jīng)使用完畢,就會(huì)關(guān)閉了
所以第一個(gè)Streaml流就不能再調(diào)用方法了
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
public class Demo02StreamFilter {
public static void main(String[] args) {
//創(chuàng)建Stream 流
Stream<String> stream = Stream.of("張三豐", "張無極", "張強(qiáng)", "趙敏", "周芷若");
//對(duì)Stream 流中的元素進(jìn)行過濾,只要姓張的, 得到一個(gè)新的流, 接收他
Stream<String> stream2 = stream.filter((String name )->{ return name.startsWith("張");});
stream2.forEach((name)-> System.out.println(name));
stream.forEach((name)-> System.out.println(name)); //報(bào)錯(cuò),
//Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
}
}
結(jié)果
張三豐
張無極
張強(qiáng)
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at con.day13.demo05.StreamAndMethod.Stream.Demo02StreamFilter.main(Demo02StreamFilter.java:13)
5、Stream 流中的常用方法-map

map映射
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
public class Demo02StreamMap {
public static void main(String[] args) {
Stream<String> stream = Stream.of("1", "2", "3", "4");
Stream<Integer> integerStream = stream.map((s) -> Integer.parseInt(s));
integerStream.forEach(i-> System.out.println(i));
}
}
結(jié)果
1
2
3
4
6、Stream 流中的常用方法-count

count
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.ArrayList;
import java.util.stream.Stream;
//統(tǒng)計(jì)流中元素的個(gè)數(shù), 返回值是long類型的整數(shù),是一個(gè)終結(jié)方法,不能再調(diào)用Stream中其他方法
public class Demo02StreamCount {
public static void main(String[] args) {
Stream<String> a = Stream.of("a", "b", "d");
System.out.println(a.count());
ArrayList<String> list = new ArrayList<>();
list.add("22");
list.add("4");
list.add("7");
Stream<String> stream2 = list.stream();
long count = stream2.count();
System.out.println(count);
}
}
3
3
7、Stream 流中的常用方法-limit
limit 是一個(gè)延遲方法, 對(duì)流中元素截取,返回一個(gè)新的流,可以調(diào)用流中其他方法

limit
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
public class Demo02StreamLimit {
public static void main(String[] args) {
Stream<String> stream = Stream.of("44", "fsdf", "t", "9", "2", "iu");
Stream<String> limit = stream.limit(4);
// System.out.println(limit.count()); //4
limit.forEach(s-> System.out.println(s));
}
}
}
結(jié)果
44
fsdf
t
9
8、Stream 流中的常用方法-skip

skip
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.Arrays;
import java.util.stream.Stream;
public class Demo02StreamSkip {
public static void main(String[] args) {
String[] arr = {"sdf","fsd","wr","il"};
Stream<String> stream = Stream.of(arr);
//跳過前三個(gè)元素
Stream<String> skip = stream.skip(3);
// System.out.println(skip.count()); 1
//遍歷新的流
skip.forEach(s -> System.out.println(s)); //il
}
}
9、Stream 流中的常用方法-concat

concat
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.stream.Stream;
public class Demo02StreamConcat {
public static void main(String[] args) {
String[] arr = {"sdf","fsd","wr","il"};
Stream<String> stream = Stream.of(arr);
String[] arr2 = {"tyui","rg","ghj","ghj"};
Stream<String> stream2 = Stream.of(arr);
Stream<String> concat1 = Stream.concat(stream, stream2);
concat1.forEach(e-> System.out.println(e));
}
}
結(jié)果
sdf
fsd
wr
il
sdf
fsd
wr
il
10、練習(xí),集合元素處理,傳統(tǒng)方式

題目
import java.util.ArrayList;
public class DemoArrayList {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("張無忌");
list1.add("黑色褲");
list1.add("迪麗熱巴");
list1.add("古力扎");
list1.add("張收到回復(fù)");
list1.add("胡返回");
//只要名字為3個(gè)字的成員,儲(chǔ)存到新集合中
ArrayList<String> list11 = new ArrayList<>();
for (String s : list1) {
if (s.length() == 3){
list11.add(s);
}
}
//只要前三個(gè)人
ArrayList<String> list12 = new ArrayList<>();
for (int i = 0; i < 3; i++) {
list12.add(list11.get(i)); //i = 0 1 2
}
ArrayList<String> list2 = new ArrayList<>();
list2.add("張三豐");
list2.add("張三好");
list2.add("張三符");
list2.add("王三看");
list2.add("張三與");
list2.add("楊三與");
//只要姓張的
ArrayList<String> list21 = new ArrayList<>();
for (String s2 : list2) {
//只要姓張的成員
if (s2.startsWith("張")) {
list21.add(s2);
}
}
//不要前兩個(gè)
ArrayList<String> list22 = new ArrayList<>();
for (int i = 2; i < list21.size(); i++) {
list22.add(list21.get(i)) ; //2 - length
}
//5、將兩個(gè)隊(duì)伍合并成一個(gè)隊(duì)伍,存儲(chǔ)到一個(gè)新的集合中
ArrayList<String> all = new ArrayList<>();
all.addAll(list12);
all.addAll(list22);
//6、根據(jù)姓名創(chuàng)建Person對(duì)象,存儲(chǔ)到一個(gè)新集合中
ArrayList<Person> list = new ArrayList<>();
for (String s : all) {
list.add(new Person(s));
}
//7、打印整個(gè)隊(duì)伍的Person
for (Person person : list) {
System.out.println(person);
}
}
}
結(jié)果
Person{name='張無忌'}
Person{name='黑色褲'}
Person{name='古力扎'}
Person{name='張三符'}
Person{name='張三與'}
11、練習(xí),集合元素處理, Stream 流處理
package con.day13.demo05.StreamAndMethod.Lianxi;
import java.util.ArrayList;
import java.util.stream.Stream;
public class DemoStream01 {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("張無忌");
list1.add("黑色褲");
list1.add("迪麗熱巴");
list1.add("古力扎");
list1.add("張收到回復(fù)");
list1.add("胡返回");
Stream<String> oneStream = list1.stream().filter(name->name.length() == 3).limit(3);
ArrayList<String> list2 = new ArrayList<>();
list2.add("張三豐");
list2.add("張三好");
list2.add("張三符");
list2.add("王三看");
list2.add("張三與");
list2.add("楊三與");
Stream<String> twoStream = list2.stream().filter(name->name.startsWith("張")).skip(2);
Stream.concat(oneStream, twoStream).map(name -> new Person(name)).forEach(p-> System.out.println(p));
//簡寫
Stream.concat(oneStream, twoStream).map(Person::new).forEach(System.out::println);
}
}
結(jié)果
Person{name='張無忌'}
Person{name='黑色褲'}
Person{name='古力扎'}
Person{name='張三符'}
Person{name='張三與'}