接受批评
这是上一篇写的文章中,一些读者的评价,这里我向各位道歉,确实写的没让大家明白,为此,我久久不能平静(写了这么久的博客,这是第一篇看到的是不同的声音),想着必须再找时间写一篇。
上一篇文章的链接(不需要策略模式也能避免满屏if/else)
上一篇主要写的太空泛,没扣标题,进而丢掉了核心思想,今天我再写一篇,不说废话,本次可能更多的是案例支撑了,实践出真知嘛,主要是让大家在开发中怎么去用,怎么去写出优质代码,这是硬道理。其实什么是优质,有人说写的让大家都能看懂是优质,有人认为正好相反,正因为写出让大家看不明白的代码才是大神,这里不做过多讨论,我们只是讨论各种方法论和案例,具体怎么用,看大家的整合水品了。
函数式编程
比如现在有这样一种场景,按照不同的机制去对商品打折促销,我举相同的例子,分别用传统的新的函数编程思想去做
传统策略模式思维
interface DiscountStrategy {
double applyDiscount(double price);
}
class BlackFridayDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
// 在黑色星期五应用折扣
if (price > 100) {
return price * 0.8; // 80%折扣
} else {
return price * 0.9; // 90%折扣
}
}
}
class ChristmasDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
// 在圣诞节应用折扣
if (price > 200) {
return price * 0.7; // 70%折扣
} else {
return price * 0.85; // 85%折扣
}
}
}
public class Main {
public static void main(String[] args) {
DiscountStrategy discountStrategy;
// 根据不同的节日选择不同的折扣策略
String festival = "Black Friday";
if (festival.equals("Black Friday")) {
discountStrategy = new BlackFridayDiscount();
} else if (festival.equals("Christmas")) {
discountStrategy = new ChristmasDiscount();
} else {
discountStrategy = null;
}
double price = 150;
if (discountStrategy != null) {
double discountedPrice = discountStrategy.applyDiscount(price);
System.out.println("Discounted price: " + discountedPrice);
} else {
System.out.println("No discount available.");
}
}
}
函数思想
下面这个就是利用Function函数编程去达到一个少写if/else的目的。大家可以找找下面的代码中if/else是否还存在!
public static void main(String[] args) {
Map discountStrategies = new HashMap();
// 定义不同的折扣策略Lambda表达式
discountStrategies.put("Black Friday", price -> {
Function discountStrategy = prices -> prices > 100 ? prices * 0.8 : prices * 0.9;
return discountStrategy.apply(price);
});
discountStrategies.put("Christmas", price -> {
Function discountStrategy = prices -> prices > 200 ? prices * 0.7 : prices * 0.85;
return discountStrategy.apply(price);
});
// 根据不同的节日选择不同的折扣策略Lambda表达式
String festival = "Black Friday";
Function discountStrategy = discountStrategies.get(festival);
//调用
double price = 150;
System.out.println("Discounted price: " + discountStrategy.apply(price));
}
函数式接口可以减少if-else语句的使用,通过使用Lambda表达式和函数式接口的特性,可以更加简洁地实现条件逻辑。想看理论层面的 可以看以前的文章!
再者就是stream流里面的流式判断 也能达到少写if/else的目的,这就不再赘述,大家很熟悉不过了
总结
总而言之,各有利弊,有的说这种写代码不好维护,出问题了也不好找,还是那句话,方法论工具很多,就看自己的选择了。本篇文章是为了弥补以前的缺口,如果你还看不明白,那只能怪自己了,也不要说这些很简单,没意义写。大家对java的stream和lambda很熟,但是这些函数式不一定都熟,大家还是要善于总结和积累
我是老际,欢迎关注公众号“1点东西”,最近在搞AI生态的一些东西,志在变现,有兴趣的可以一起玩玩