一文教會你使用JAVA8 Stream API

Stream簡介

JAVA8的新特性,更方便的處理數據,Java把很多東西都封裝好了,我們只要調用Api就好了真.調參編程。

例子:

我們先準備一個實體類,方便之後的講解。

<code>publicclassPerson{
privateStringname;
privateintage;
privateStringsex;

publicstaticList<person>getList(){
List<person>list=newArrayList<>();
Personzs=newPerson("zss",18,"女");
Personls=newPerson("lss",18,"男");
Personwmz=newPerson("wmzs",20,"女");
Personzmz=newPerson("zmzs",20,"男");
Personlmz=newPerson("lmz",25,"男");
returnArrays.asList(zs,ls,wmz,zmz,lmz);
}
//省略一些getter、setter方法
}
/<person>/<person>/<code>

Filter

用來過濾數據的,下面看一個例子:將所有性別為女的對象添加到列表中

<code>publicvoidfilterSex(){
List<person>personList=Person.getList();
//舊的版本
List<person>personList1=newArrayList<>();
for(Personperson:personList){
if("女".equals(person.getSex())){
personList1.add(person);
}
}

//用Stream的版本
List<person>list=personList
.stream()
.filter(person->"女".equals(person.getSex()))
.collect(Collectors.toList());

}

publicvoidfilterSex(){
List<person>personList=Person.getList();
//舊的版本
List<person>personList1=newArrayList<>();
for(Personperson:personList){
if("女".equals(person.getSex())){
personList1.add(person);
}
}

//用Stream的版本
List<person>list=personList
.stream()
.filter(person->"女".equals(person.getSex()))
.collect(Collectors.toList());

}
/<person>/<person>/<person>/<person>/<person>/<person>/<code>

Map

可以將對象轉換為其他的對象,下面的例子是獲取所有人的年齡

<code>publicvoidgetUserAge(){
List<person>personList=Person.getList();
//舊的版本
List<integer>personList1=newArrayList<>();
for(Personperson:personList){
personList1.add(person.getAge());
}
//用Stream的版本1
List<integer>list=personList.stream().map(person->person.getAge()).collect(Collectors.toList());
//用Stream的版本2
List<integer>list1=personList.stream().map(Person::getAge).collect(Collectors.toList());
//用Stream的版本3
List<integer>list2=personList.stream().map(person->{returnperson.getAge();}).collect(Collectors.toList());
}
/<integer>/<integer>/<integer>/<integer>/<person>/<code>

FlatMap

可以處理更深層次的map.下面的例子是將對象的名字通過空格分割放到列表中

<code>publicvoidflatMap(){
List<person>personList=Person.getList();
//用flatMap
List<string>list=personList.stream()
.flatMap(person->Arrays.stream(person.getName().split(""))).collect(Collectors.toList());
list.forEach(System.out::println);
//用map實現
List<stream>>streamList=personList.stream()
.map(person->Arrays.stream(person.getName().split(""))).collect(Collectors.toList());
for(Stream<string>s:streamList){
s.map(s1->{System.out.println(s1);returns1;}).collect(Collectors.toList());
}
//用Map+flatMap實現1
List<string>list1=personList.stream()
.map(person->person.getName().split(""))
.flatMap(Arrays::stream).collect(Collectors.toList());
list1.forEach(System.out::println);
//用Map+flatMap實現2
List<string>list2=personList.stream()
.map(person->person.getName().split(""))
.flatMap(str->Arrays.asList(str).stream()).collect(Collectors.toList());
list2.forEach(System.out::println);
}
Reduce

累加用的,下面的例子是將給定的數進行累加

publicvoidreduceTest(){
//第一種reduce方式
Optionalsum=Stream.of(1,2,3,4)
//如果沒有給初始值,那麼初始值就是前兩個
.reduce((acc,item)->{
System.out.println(acc);
System.out.println(item);
System.out.println();
acc+=item;
returnacc;
});
System.out.println(sum.get());

//第二種reduce方式
Optionalsum1=Stream.of(1,2,3,4)
//如果沒有給初始值,那麼初始值就是前兩個

.reduce((acc,item)->acc+item);
System.out.println(sum1.get());

//第三種reduce方式
Integersum2=Stream.of(1,2,3,4)
//給了初始值,初始值就是第一個數0,根據初始值來判斷最後返回的類型
.reduce(0,(acc,item)->{
System.out.println(acc);
System.out.println(item);
System.out.println();
acc+=item;
returnacc;
});
System.out.println(sum2);

//第四種reduce方式
Stringsum4=Stream.of("1","2","3","4")
//給了初始值,初始值就是第一個數0,根據初始值來判斷最後返回的類型
.reduce("0",(acc,item)->acc+item);
System.out.println(sum4);

}
/<string>/<string>/<string>/<stream>/<string>/<person>/<code>

Collect

可以將流轉成list、map、等常用的數據結構

<code>publicvoidtoCollect(){
List<person>personList=Person.getList();
//將對象的名字提取出來存到list裡面
List<string>list=personList.stream().map(person->person.getName()).collect(Collectors.toList());
//將對象的名字提前出來存到set裡面
Set<string>set=personList.stream().map(person->person.getName()).collect(Collectors.toSet());;
//將對象的名字當做key,對象的年齡當做age
Map<string>personMap=personList.stream()
.collect(Collectors.toMap(Person::getName,Person::getAge));
//第二種寫法,其實和前面的例子一樣

personList.stream()
.collect(Collectors.toMap(person->person.getName(),person->person.getAge()));
//這個遍歷也是Java8的新特性
personMap.forEach((key,value)->{
System.out.println(key+""+value);
});

//將Person的用戶名存到HashSet中
HashSet<string>hashSet=personList.stream().map(person->person.getName())
.collect(Collectors.toCollection(()->newHashSet<>()));
//將Person的用戶名存到HashSet中第二種寫法
personList.stream().map(person->person.getName())
.collect(Collectors.toCollection(HashSet::new));

//將對象的名字通過|拼接起來輸出"zss|lss|wmzs|zmzs|lmzs"
Stringstring=personList.stream().map(person->person.getName())
.collect(Collectors.joining("|"));
System.out.println(string);
//將對象的名字通過|拼接起來,包含在[]裡面輸出"[zss|lss|wmzs|zmzs|lmzs]"
Stringstring1=personList.stream().map(person->person.getName())
.collect(Collectors.joining("|","[","]"));
System.out.println(string1);

//統計各個年齡的人數放到map中
Map<integer>personGroup=personList.stream()
.collect(Collectors.groupingBy(Person::getAge,Collectors.counting()));

//遍歷
personGroup.forEach((key,value)->{
System.out.println(key+""+value);
});

}
/<integer>/<string>/<string>/<string>/<string>/<person>/<code>

Optional

Optional 是用於防止 NullPointerException 的一個工具類。

<code>publicvoidoptionalTest(){
Personp=newPerson();

//of方法裡面的參數不能為空值,否則初始化報錯。
Optional<object>o=Optional.of(p);
//如果Optional有值則將其返回,否則拋出NoSuchElementException
System.out.println(o.get());
//ofNullable裡面的參數可以為空值。
Optional<string>optional=Optional.ofNullable(null);
//isPresent():如果值存在返回true,否則返回false
System.out.println(optional.isPresent()?o.get():"null");
//orElse():如果有值則將其返回,否則返回指定的其它值
System.out.println(optional.orElse("ball"));
//如果o不為空,那麼將執行裡面的程序,否則不做處理
o.ifPresent(s->System.out.println(s));
}
/<string>/<object>/<code>

看完之後是不是感覺Stream很簡單,很方便呢,把以前的繁瑣步驟都簡化了許多。JAVA天下第一!!!

公眾號:千珏(jue),後臺留言給我吧


一文教會你使用JAVA8 Stream API


分享到:


相關文章: