天天看點

《java8函數式程式設計》第三章課後習題

記錄自己學習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