您的位置 首页 java

一道有趣的java练手题,改造if-else

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

题目

这题看着不是很难,刚开始简单实现了一下,用了很多的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>函数是懒加载的,方法不会被执行。

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"));
    }  

测试结果:

测试结果

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

文章来源:智云一二三科技

文章标题:一道有趣的java练手题,改造if-else

文章地址:https://www.zhihuclub.com/185953.shtml

关于作者: 智云科技

热门文章

网站地图