java supplier_一道有趣的java练手题

5bebaad4e995be0e30d69893b68a4ad3.png

我在百度知道上看到了一道求解的Java题。原题如下:

7282eb996b7c141c48503359d9ed2545.png

题目

这题看着不是很难,刚开始简单实现了一下,用了很多的if ~ else,感觉不太好。百度了一下,发现jdk1.8的lambda表达式,提供了Supplier<T>这个函数成功解决了这个问题。看一下代码:

//判断三角形形状
class Demo2{

    private static BigDecimal first;

    private static BigDecimal second;

    private static BigDecimal third;
  
  	//构造数据
    private static void build(BigDecimal first, BigDecimal second, BigDecimal third){
        Demo2.first = first;
        Demo2.second = second;
        Demo2.third = third;
    }
  

    private static List<Supplier<String>> list = new ArrayList<>();

    //lambda表达式干掉if-else 并且可配置
    //顺序很重要,这里的顺序是方法执行的顺序
    static {
        list.add(Demo2::scaleneTriangle);
        list.add(Demo2::isoscelesTriangle);
        list.add(Demo2::rightAngledTriangle);
        list.add(Demo2::obtuseTriangle);
        list.add(Demo2::acuteTriangle);
    }

    //获取三角形形状
    static String getTriangle(BigDecimal first, BigDecimal second, BigDecimal third){
        //数据导入
        build(first, second, third);
        //判断是否是三角形
        if(isTriangle() != null){
            return isTriangle();
        }
        for(Supplier<String> supplier:list){
            String s = supplier.get(); //执行方法
            if(s == null){
                continue;
            }
            return s;
        }
        return null;
    }

    //判断是否是三角形 任意两边之和大于第三边
    private static String isTriangle(){
        boolean b = first.add(second).compareTo(third) == 1;
        boolean b1 = first.add(third).compareTo(second) == 1;
        boolean b2 = second.add(third).compareTo(first) == 1;
        if(b && b1 && b2){
            return null;
        }else{
            return "这不能构成三角形";
        }
    }

    //等边三角形 三边相等
    private static String scaleneTriangle(){
        System.out.println("等边三角形方法执行了");
        boolean b = first.compareTo(third) == 0;
        boolean b1 = first.compareTo(second) == 0;
        if(b && b1){
            return "这是一个等边三角形";
        }
        return null;
    }

    //等腰三角形 任意两边相等
    private static String isoscelesTriangle(){
        System.out.println("等腰三角形方法执行了");
        boolean b = first.compareTo(third) == 0;
        boolean b1 = first.compareTo(second) == 0;
        boolean b2 = second.compareTo(first) == 0;
        if(b || b1 || b2){
            return "这是一个等腰三角形";
        }
        return null;
    }

    //直角三角形 任意两边的平方等于第三边的平方
    private static String rightAngledTriangle(){
        System.out.println("直角三角形方法执行了");
        boolean b = first.multiply(first).add(second.multiply(second)).compareTo(third.multiply(third)) == 0;
        boolean b1 = first.multiply(first).add(third.multiply(third)).compareTo(second.multiply(second)) == 0;
        boolean b2 = third.multiply(third).add(second.multiply(second)).compareTo(first.multiply(first)) == 0;
        if(b || b1 || b2){
            return "这是一个直角三角形";
        }
        return null;
    }
    //钝角三角形 任意两边的平方小于第三边的平方
    private static String obtuseTriangle(){
        System.out.println("钝角三角形方法执行了");
        boolean b = first.multiply(first).add(second.multiply(second)).compareTo(third.multiply(third)) == -1;
        boolean b1 = first.multiply(first).add(third.multiply(third)).compareTo(second.multiply(second)) == -1;
        boolean b2 = third.multiply(third).add(second.multiply(second)).compareTo(first.multiply(first)) == -1;
        if(b || b1 || b2){
            return "这是一个钝角三角形";
        }
        return null;
    }

    //锐角三角形 任意两边的平方大于第三边的平方
    private static String acuteTriangle(){
        System.out.println("锐角三角形方法执行了");
        boolean b = first.multiply(first).add(second.multiply(second)).compareTo(third.multiply(third)) == 1;
        boolean b1 = first.multiply(first).add(third.multiply(third)).compareTo(second.multiply(second)) == 1;
        boolean b2 = third.multiply(third).add(second.multiply(second)).compareTo(first.multiply(first)) == 1;
        if(b || b1 || b2){
            return "这是一个锐角三角形";
        }
        return null;
    }
}

if-else改造的关键:在类初始化时,用list集合(容器)将所有的方法保存起来,list有序,执行时会按照顺序执行,Supplier<T>函数是懒加载的,方法不会被执行。

1f763ede5ad5ec3831dcc76acd6c1e1f.png

if-else改造关键代码

注意:Supplier<String> 用法

Supplier<String> scaleneTriangle = Demo2::scaleneTriangle //简写
//等价于
Supplier<String> scaleneTriangle = () -> scaleneTriangle();
//等价于
Supplier<String> supplier = new Supplier<Fruit>() {
	@Override
  public Fruit get() {
  	return scaleneTriangle(); //需要存储的方法
  }
};

测试:

//测试
    public static void main(String[] args) {
        BigDecimal first, second, third;
        String choice;
        Scanner input=new Scanner(System.in);
        do {
            System.out.print("请输入第一条边:");
            first = input.nextBigDecimal();
            System.out.print("请输入第二条边:");
            second = input.nextBigDecimal();
            System.out.print("请输入第三条边:");
            third = input.nextBigDecimal();
            String message = getTriangle(first, second, third);//执行
            System.out.println(message);
            System.out.print("继续吗?(y/n):");
            choice=input.next();
            if (choice.equals("n")){
                System.out.println("谢谢使用!");
                break;
            }
        }while (choice.equals("y"));
    }

测试结果:

fa88ba998e4d9e58a6ced8f7cf301317.png

测试结果

百度知道,不知道什么原因没有审核成功,发到这里请大家指点一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值