記錄自己學習Lambda的拙劣過程,寫部落格完全是為了讓自己把每個題目都過一遍,其實這本書對應的GitHub上面,已經給出了各個題目的過程。
下面給出自己練習的痕迹。
1、常用流操作
package java8;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Author: cxh
* @CreateTime: 17/12/14 20:47
* @ProjectName: JavaBaseTest
* <測試類></>
*/
public class Test {
public static void main(String[] args) {
//1.1求和
Stream<Integer> stream;
List<Integer> list=new LinkedList<>();
list.add(1);list.add(2);list.add(4);
stream=list.stream();
System.out.println(addUp(stream));
System.out.println("---------1.1輸出結束--------------");
//1.2傳回字元串清單,包含藝術家的姓名和國籍
List<String> nameAndOriginal;
ArrayList<Artist> nao=new ArrayList<>();
nao.add(new Artist("Holino",null,"Landon"));
nao.add(new Artist("Luciba",null,"China"));
nao.add(new Artist("Luciyi",null,"Australia"));
nameAndOriginal=getNameAndOriginal(nao);
for(String str:nameAndOriginal)
System.out.println(str);
System.out.println("---------1.2輸出結束-----------------");
//1.3傳回最多包含3首歌曲的專輯組成的清單
Set<Album> albums;
ArrayList<Album> albumArrayList=new ArrayList<>();
for(int i=1;i<6;i++){
albumArrayList.add(new Album("qisi",getTracks(i),getArtists()));
}
Set<Album> albumSet=getAlbums(albumArrayList);
for(Album a:albumSet){
System.out.println("name is: "+a.getName()+"tracks`size is:"+a.getTracks().size());
}
System.out.println("---------1.3輸出結束-----------------");
}
//1.1計算流中所有數字之和
private static int addUp(Stream<Integer> numbers){
return numbers.reduce(0,(acc,elemeent)->(acc+elemeent)).intValue();
}
//1.2傳回字元串清單,包含藝術家的姓名和國籍
private static List<String> getNameAndOriginal(ArrayList<Artist> list){
List<String> res;
res=list.stream()
.map(artist -> "name is: "+artist.getName()+" and original is: "+artist.getOriginal()+" ,")
.collect(Collectors.toList());
return res;
}
//1.3傳回最多包含3首歌曲的專輯組成的清單
private static Set<Album> getAlbums(ArrayList<Album> list){
Set<Album> res;
res=list.stream()
.filter(album -> album.getTracks().size()<=3)
.collect(Collectors.toSet());
return res;
}
//擷取藝術家清單
private static ArrayList<Artist> getArtists(){
ArrayList<Artist> res=new ArrayList<>();
for(int i=0;i<5;i++){
ArrayList<String> members=new ArrayList<>();
members.add("lili");
members.add("zhouqing");
res.add(new Artist("ladygaga",members,"europe"));
}
return res;
}
//擷取歌曲清單
private static ArrayList<Track> getTracks(int count){
ArrayList<Track> tracks=new ArrayList<>();
for(int i=0;i<count;i++){
Track track=new Track("qicaishiguang",10);
tracks.add(track);
}
return tracks;
}
}
//輸出結果:
7
---------1.1輸出結束--------------
name is: Holino and original is: Landon ,
name is: Luciba and original is: China ,
name is: Luciyi and original is: Australia ,
---------1.2輸出結束-----------------
name is: qisi and the track`s size is:2
name is: qisi and the track`s size is:3
name is: qisi and the track`s size is:1
---------1.3輸出結束-----------------
Process finished with exit code 0
2、疊代。将for循環的外部疊代改為内部疊代 。
package java8;
import java.util.ArrayList;
/**
* @Author: cxh
* @CreateTime: 17/12/14 20:47
* @ProjectName: JavaBaseTest
* <測試類></>
*/
public class Test {
public static void main(String[] args) {
ArrayList<Artist> artists=getArtists();
//輸出artists
System.out.println("---------以下為各個Artist中的成員個數----------");
for(Artist a:artists){
System.out.print(a.getMembers().size()+",");
}
System.out.println();
System.out.println("---------下面為使用Lambda表達式求各個Artist中成員的總數--------");
int res=artists.stream().map(artist -> artist.getMembers().size())
.reduce(0,(acc,members)->(acc+members))
.intValue();
System.out.println(res);
}
//擷取藝術家清單
private static ArrayList<Artist> getArtists(){
ArrayList<Artist> res=new ArrayList<>();
for(int i=0;i<6;i++){
ArrayList<String> members=new ArrayList<>();
for(int j=-1;j<i;j++){
members.add("lili"+i);
}
res.add(new Artist("ladygaga"+i,members,"europe"+i));
}
return res;
}
}
//運作結果
---------以下為各個Artist中的成員個數----------
1,2,3,4,5,6,
---------下面為使用Lambda表達式求各個Artist中成員的總數--------
21
Process finished with exit code 0
6、求一個字元串中小寫字母的個數。
package java8;
import java.util.ArrayList;
/**
* @Author: cxh
* @CreateTime: 17/12/14 20:47
* @ProjectName: JavaBaseTest
* <測試類></>
*/
public class Test {
public static void main(String[] args) {
String str="123qwe";
long res;
res=str.chars().filter(c->c>=97 &&c<=122)
.count();
System.out.println(res);
/**
* String的chars()方法分析
*/
int[] test=str.chars().toArray();
for(int i:test)
System.out.println(i);
/**
* 輸出:
* 49
* 50
* 51
* 113
* 119
* 101
*
* 是以,從輸出結果可以知道:chars()方法,傳回的是字元串中所有字元對應的assii碼值.
* 通過chars()源碼可以知道:JDK1.8才開始有這個方法.它傳回的是int類型的資料流:IntStream
*/
}
}
//輸出結果
3
Process finished with exit code 0
7、求字元串清單中:包含最多小寫字母的字元串。
package java8;
import java.util.ArrayList;
import java.util.Comparator;
/**
* @Author: cxh
* @CreateTime: 17/12/14 20:47
* @ProjectName: JavaBaseTest
* <測試類></>
*/
public class Test {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
for(int i=1;i<10;i++){
StringBuilder sb=new StringBuilder();
for(int j=0;j<=i;j++){
sb.append("d");
}
list.add(sb.toString());
}
String max=list.stream().max(Comparator.comparing(s ->getCount(s) )).get();
System.out.println(max);
}
/**
* 擷取字元串str中包含的小寫字母個數
* @param str
* @return
*/
private static long getCount(String str){
return str.chars().filter(c->c>=97 && c<=122).count();
}
}
//輸出結果
dddddddddd
Process finished with exit code 0