我在百度知道上看到了一道求解的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"));
}
测试结果:
测试结果
百度知道,不知道什么原因没有审核成功,发到这里请大家指点一下。