天天看点

《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