1、兩種獲取Stream流的方式
java.util.stream.Stream<T> 是java 8 加入的最常用的流接口清女,這并不是一個函數(shù)式接口
獲取流兩種方式:
1、所有Collection 集合(單列集合)都可以通過stream默認方式獲取流
default Stream<E> stream()
2、Stream接口的靜態(tài)方法of可以獲取數(shù)組對應的流
static <T> Stream<T> of (T... values)
參數(shù)是一個可變參數(shù)绘盟,就可傳遞一個數(shù)組
package con.day13.demo05.StreamAndMethod.Stream;
import java.util.*;
import java.util.stream.Stream;
/*
兩種方式獲取流
1、Collection 接口中的方法stream()
2龄毡、Stream接口的靜態(tài)方法of:返回單個元素的序列Stream
static <T> Stream<T> of (T... values)
參數(shù)是一個可變參數(shù),可傳遞一個數(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)祭隔;
該方法接收一個Consumer函數(shù)接口,會將每一個流元素交給該函數(shù)進行處理
Consumer 是一個消費性的函數(shù)式接口,可以傳遞Lambda表達式
注意:
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表達式
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("張三豐", "張無極", "張強", "趙敏", "周芷若");
//對Stream 流中的元素進行過濾,只要姓張的, 得到一個新的流搞坝, 接收他
Stream<String> stream2 = stream.filter((String name )->{ return name.startsWith("張");});
stream2.forEach((name)-> System.out.println(name));
}
}
4搔谴、Stream 流的特點,只能使用一次
Stream流屬于管道流桩撮,只能被使用一次
第一個Stream流調(diào)用完畢方法敦第,數(shù)據(jù)就會流轉(zhuǎn)到下一個Stream 上
而這時第一個Stream流已經(jīng)使用完畢,就會關閉了
所以第一個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("張三豐", "張無極", "張強", "趙敏", "周芷若");
//對Stream 流中的元素進行過濾店量,只要姓張的, 得到一個新的流芜果, 接收他
Stream<String> stream2 = stream.filter((String name )->{ return name.startsWith("張");});
stream2.forEach((name)-> System.out.println(name));
stream.forEach((name)-> System.out.println(name)); //報錯,
//Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
}
}
結(jié)果
張三豐
張無極
張強
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)計流中元素的個數(shù), 返回值是long類型的整數(shù),是一個終結(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 是一個延遲方法, 對流中元素截取疼鸟,返回一個新的流后控,可以調(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);
//跳過前三個元素
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浩淘、練習,集合元素處理吴攒,傳統(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("張收到回復");
list1.add("胡返回");
//只要名字為3個字的成員张抄,儲存到新集合中
ArrayList<String> list11 = new ArrayList<>();
for (String s : list1) {
if (s.length() == 3){
list11.add(s);
}
}
//只要前三個人
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);
}
}
//不要前兩個
ArrayList<String> list22 = new ArrayList<>();
for (int i = 2; i < list21.size(); i++) {
list22.add(list21.get(i)) ; //2 - length
}
//5、將兩個隊伍合并成一個隊伍洼怔,存儲到一個新的集合中
ArrayList<String> all = new ArrayList<>();
all.addAll(list12);
all.addAll(list22);
//6、根據(jù)姓名創(chuàng)建Person對象极谊,存儲到一個新集合中
ArrayList<Person> list = new ArrayList<>();
for (String s : all) {
list.add(new Person(s));
}
//7轻猖、打印整個隊伍的Person
for (Person person : list) {
System.out.println(person);
}
}
}
結(jié)果
Person{name='張無忌'}
Person{name='黑色褲'}
Person{name='古力扎'}
Person{name='張三符'}
Person{name='張三與'}
11咙边、練習,集合元素處理王带, 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("張收到回復");
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='張三與'}