Lambda lambda表达式 算法题 不死神兔 猴子吃桃 爬楼梯

Lambda

在这里插入图片描述

最直观的作用就是简化匿名内部类的写法如上

   public static void main(String[] args) {

        Integer arr[]={2,1,4,6,3,5,8,7,9};


        Arrays.sort(arr, (Integer o1, Integer o2)-> {

                    return o1 - o2;
                }
                //o1 -o2 是升序
                //o2-o1是升序
                    );

        System.out.println(Arrays.toString(arr));

    }

上面就是函数式编程
函数式编程思想,忽略面向对象的复杂语法,强调躲什么,而不是谁去做

lambda表达式标准格式

在这里插入图片描述
在这里插入图片描述

public class lambdaTest {
    public static void main(String[] args) {




       /* method(new Swim() {
            @Override
            public void swimming() {
                System.out.println("我正在游泳");
            }
        });*/


        method(
                ()-> {
                System.out.println("我正在游泳");

                //可以使用lambda 因为接口只有有一个抽象方法
                    
        }
        );
    }

    private static void method(Swim s) {

        s.swimming();

    }

}
interface Swim{

    public abstract void swimming();

}

在这里插入图片描述

总结

lambda让代码更简洁,让我们更加关注于方法体,而不像面向对象必须先创建对象才能使用方法体
在这里插入图片描述

lambda进阶省略写法

核心:可推导可省略
在这里插入图片描述

    public static void main(String[] args) {
        Integer arr[]={2,1,4,6,3,5,8,7,9};



        //原版写法
      /*  Arrays.sort(arr, (Integer o1, Integer o2)-> {

                    return o1 - o2;
                }
        );*/

        //省略写法
        Arrays.sort(arr, (o1,  o2)-> o1 - o2);

        System.out.println(Arrays.toString(arr));

    }

练习

 public static void main(String[] args) {

        String arr[]={"aaa","a","aaaa","aa"};
        //想要的结果 a aa aaa aaaa


       /* Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return  o1.length()-o2.length();
            }
        });*/
        //简化写法
        Arrays.sort(arr,( o1,  o2)->o1.length()-o2.length());

        //[a, aa, aaa, aaaa]
        System.out.println(Arrays.toString(arr));//[a, aa, aaa, aaaa]


    }

算法题

在这里插入图片描述

拓展如下

 String s1="a";
        String s2="b";
        System.out.println(s1.compareTo(s2));
        //打印结果为-1.因为这个比较是拿字母表比较的a在b后面所以返回-1.
        //返回-1这个值的原因是在ascii表中a是97 b是98  97-98所以是-1

        String s11="abc";
        String s22="abd";
        System.out.println(s11.compareTo(s22));
        //-1为结果 这个是逐个比较的 ab相等比较cd 相差-1

{

      /*  String s1="a";
        String s2="b";
        System.out.println(s1.compareTo(s2));
        //打印结果为-1.因为这个比较是拿字母表比较的a在b后面所以返回-1.
        //返回-1这个值的原因是在ascii表中a是97 b是98  97-98所以是-1

        String s11="abc";
        String s22="abd";
        System.out.println(s11.compareTo(s22));
        //-1为结果 这个是逐个比较的 ab相等比较cd 相差-1
*/

        //先创建三个女朋友对象
        girlFriend1 gf1=new girlFriend1("nei",18,1.67);
        girlFriend1 gf2=new girlFriend1("li",19,1.72);
        girlFriend1 gf3=new girlFriend1("chen",19,1.78);


        //把三个对象存入数组

        girlFriend1[]girlFriendArr={gf1,gf2,gf3};



        //利用Arrays进行排序
        //匿名内部类的方式

      /*  Arrays.sort(girlFriendArr, new Comparator<girlFriend1>() {
            @Override
            public int compare(girlFriend1 o1, girlFriend1 o2) {

                //按照年龄大小排序 年龄一样,按照身高排序,身高一样按照姓名的字母排序
                double temp=o2.getAge()-o1.getAge();

                //三目运算符
                temp=temp==0?o1.getHeight()-o2.getHeight():temp;
                //这个三目运算符的意思是 temp为0那么比较年龄.:否则就是temp;

                temp=temp==0?o1.getName().compareTo(o2.getName()):temp;

                if(temp>0){
                    return 1;
                }else if(temp<0){
                    return -1;
                }else{
                    return 0;
                }


                //或者写成如下  但是需要强制转换

                //return  temp;



                //打印


            }
        });*/

        //接下来展示用lambda表达式写法
        Arrays.sort(girlFriendArr,( o1,  o2)-> {

                //按照年龄大小排序 年龄一样,按照身高排序,身高一样按照姓名的字母排序
                double temp=o2.getAge()-o1.getAge();

                //三目运算符
                temp=temp==0?o1.getHeight()-o2.getHeight():temp;
                //这个三目运算符的意思是 temp为0那么比较年龄.:否则就是temp;

                temp=temp==0?o1.getName().compareTo(o2.getName()):temp;

                if(temp>0){
                    return 1;
                }else if(temp<0){
                    return -1;
                }else{
                    return 0;
                }


                //或者写成如下  但是需要强制转换

                //return  temp;



                //打印


            }
        );

        System.out.println(Arrays.toString(girlFriendArr));


    }

不死神兔

在这里插入图片描述
找到规律前两个月数量之和等于第三个月

    public static void main(String[] args) {

        //看看第12个月兔子的数量(斐波那契)
/*

        int arr[]=new int[12];


        //前两个是固定的所以直接赋值
        arr[0]=1;
        arr[1]=1;
        //循环得到后面的

        for (int i = 2; i < arr.length; i++) {

            arr[i]=arr[i-1]+arr[i-2];
            //因为后面的等于前两个的天数之和

        }
        System.out.println(arr[11]);*/




        //解决方案2 递归
        //找规律
        //月份 fn(12)=fn(11)+fn(10);
        //fn代表方法名 12个月兔子的数量等于11个月兔子数量加10个月兔子数量
        //月份 fn(11)=fn(10)+fn(9);
        //月份 fn(10)=fn(9)+fn(8);
        //月份 fn(9)=fn(8)+fn(7);

        //...
        //fn(2)=1;
        //fn(1)=1;


        System.out.println(getSum(12));

    }

    private static int getSum(int month) {
        if(month==1|| month==2){
            return 1;
        }
        return getSum(month-1)+getSum(month-2);

    }

猴子吃桃

在这里插入图片描述

 public static void main(String[] args) {
        //day10天有一个这个是已知的
        //规律每天桃子数量是后一天桃子数量加1再×2

        //day10=1
        //day9(day10+1)×2=4个
        //day10是递归的出口


        System.out.println(getCount(1));
        //1534第一天桃子数量
    }

    private static int getCount(int day) {
        if(day<=0||day>10){
            System.out.println("不存在的天数");
            return -1;


        }

        if(day==10){
            return 1;
        }

        //规律每天桃子数量是后一天桃子数量加1再×2
        return (getCount(day+1)+1)*2;
    }

爬楼梯

在这里插入图片描述

  public static void main(String[] args) {

        //一种台阶一种爬法
        //两种台阶两种
        //7层台阶21种爬法
        //100层多少种爬法


        //递归的出口1阶台阶2阶台阶


        System.out.println(getCount(20));
        //10946种
    }

    private static int getCount(int n) {
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;

        }

        return getCount(n-1)+getCount(n-2);
        //因为第20层台阶的爬法等于第19层台阶爬法加第十八层台阶爬法
    }

public static void main(String[] args) {
        //拓展
        //有时候一次爬一个 有时候一次爬两个 有时候一次爬三个


        System.out.println(getCount(20));

//121415


    }

    private static int getCount(int n) {
        if(n==1){
            return 1;

        }
        if(n==2){
            return 2;
        }
        if(n==3){
            return 4;//这里4的原因是因为第四层有四种爬的方法
        }
        //以上为递归出口
        return getCount(n-1)+getCount(n-2)+getCount(n-3);

    }
    //拓展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值