Apache的commons之函數語言程式設計Closure(二)
阿新 • • 發佈:2018-12-20
Closure 閉包 封裝特定的業務功能
員工類
//員工類 static class Staff { private String name; private double money; @Override public String toString() { return "staff{" + "name='" + name + '\'' + ", money=" + money + '}'; } public Staff() { } public Staff(String name, int money) { this.name = name; this.money = money; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } }
Closure使用如下
public static void baseic() { //建立容器 List<Staff> list = new ArrayList<>(); list.add(new Staff("zs", 2000)); list.add(new Staff("lisi", 1000)); list.add(new Staff("www", 3000)); Closure<Staff> closure = new Closure<Staff>() { @Override public void execute(Staff s) { //工資全部上漲1.2 s.setMoney(s.getMoney() * 1.2); } }; //工具類 方法已經過時 IterableUtils.forEach取代 //CollectionUtils.forAllDo(list, closure); IterableUtils.forEach(list, closure); //迴圈輸出 list.stream().forEach(System.out::println); }
IfClosure的簡單使用
建立商品實體
package com.hp.common; /** * 商品實體類 */ public class Goods { private String name; private double price; //是否打折 private boolean discount; public Goods(String name, double price, boolean discount) { this.name = name; this.price = price; this.discount = discount; } public Goods(){} public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public boolean isDiscount() { return discount; } public void setDiscount(boolean discount) { this.discount = discount; } @Override public String toString() { return "Goods{" + "name='" + name + '\'' + ", price=" + price + ", discount=" + discount + '}'; } }
IfClosure的簡單使用使用如下
//如果商品 打折 則打九折 否則滿100 減20
public static void IfClosure() {
List<Goods> list = new ArrayList<>();
list.add(new Goods("javase", 120, true));
list.add(new Goods("c++", 100, false));
list.add(new Goods("c#", 80, false));
//滿100 -20
Closure<Goods> closure = new Closure<Goods>() {
@Override
public void execute(Goods input) {
if (input.getPrice() >= 100) {
input.setPrice(input.getPrice() - 20);
}
}
};
//打九折
Closure<Goods> closure1 = new Closure<Goods>() {
@Override
public void execute(Goods input) {
if (input.isDiscount()) {
input.setPrice(input.getPrice() * 0.9);
}
}
};
Predicate<Goods> predicate = new Predicate<Goods>() {
@Override
public boolean evaluate(Goods goods) {
return goods.isDiscount();
}
};
//二選一的操作 IfClosure.ifClosure(斷言,為true執行,為false執行)
Closure<Goods> ifClosure = IfClosure.ifClosure(predicate, closure1, closure);
//
IterableUtils.forEach(list, ifClosure);
//迴圈輸出
list.stream().forEach(System.out::println);
}
WhileClosure使用如下
//員工的工資 最低不超過1w 如果超過什麼也不變
public static void minimumWage() {
List<Staff> list = new ArrayList<>();
list.add(new Staff("張三", 10000));
list.add(new Staff("李四", 8000));
list.add(new Staff("王五", 5000));
//業務邏輯
Closure<Staff> closure = new Closure<Staff>() {
@Override
public void execute(Staff input) {
input.setMoney(input.getMoney() * 1.2);
}
};
Predicate<Staff> predicate = new Predicate<Staff>() {
@Override
public boolean evaluate(Staff staff) {
return staff.getMoney() < 10000;
}
};
// dolop 為false 先執行,後判斷 為true 先判斷後執行
Closure<Staff> staffClosure = WhileClosure.whileClosure(predicate, closure, false);
IterableUtils.forEach(list,staffClosure);
//迴圈
list.stream().forEach(System.out::println);
}
ChainedClosure使用如下
//如果商品打折 則打九折 九折後超過100 -20 滿百-20
public static void checkClosure(){
List<Goods> list = new ArrayList<>();
list.add(new Goods("javase", 120, true));
list.add(new Goods("c++", 100, false));
list.add(new Goods("c#", 80, false));
//打折商品 打九折
Closure<Goods> closure=new Closure<Goods>() {
@Override
public void execute(Goods input) {
if (input.isDiscount()) {
input.setPrice(input.getPrice() * 0.9);
}
}
};
//滿一百減20
Closure<Goods> closure1=new Closure<Goods>() {
@Override
public void execute(Goods input) {
if (input.getPrice()>=100) {
input.setPrice(input.getPrice() -20);
}
}
};
Closure<Goods> goodsClosure = ChainedClosure.chainedClosure(closure, closure1);
IterableUtils.forEach(list,goodsClosure);
list.forEach(System.out::println);
}