lambda 改写策略模式,减少冗余代码
/**
* ClassName: My
*
* @author leegoo
* @Description:
* @date 2019年04月28日
*/
public class My {
public static final String STRING_RE = "[a-z]+";
public static final String NUMBER_RE = "[0-9]+";
public static void main(String[] args) {
//最原始的策略模式
Vild vSource = new StringValid(); //如果需要验证int类型,那么可以再写一个IntValid实现Vild接口即可,实现方式与StringValid类型
vSource.v("啊啊啊");
//匿名内部类
Vild vAnonymous = new Vild() {
@Override
public Boolean v(String str) {
return str.matches(My.STRING_RE);
}
};
vAnonymous.v("啊啊啊");
//lambda
Vild vLambd = s -> s.matches(My.STRING_RE);
Boolean aBoolean = vLambd.v("啊啊啊");
System.out.println(aBoolean);
}
}
@FunctionalInterface
interface Vild {
Boolean v(String str);
}
class StringValid implements Vild {
@Override
public Boolean v(String str) {
return str.matches(My.STRING_RE);
}
}
lambda 改写模板模式,减少冗余代码
首先是最原始的实现方式
abstract class OnlineBanking {
public void processCustomer(int id){
Customer c = Database.getCustomerWithId(id); //查询会员
makeCustomerHappy(c); //让会员happy
}
abstract void makeCustomerHappy(Customer c); //未实现具体的方法
// dummy Customer class
static private class Customer {}
// dummy Datbase class
static private class Database{
static Customer getCustomerWithId(int id){ return new Customer();}
}
public static void main(String[] args) {
OnlineBanking banking = new OnlineBanking() {
//重写 makeCustomerHappy方法
@Override
void makeCustomerHappy(Customer c) {
System.out.println("send gift....");
}
};
//再次调用即可 send gift.....
banking.processCustomer(1);
}
}
接下来是lambda实现方式
public class OnlineBankingLambda {
public static void main(String[] args) {
// Customer::sendCard 调用sendCard方法,也可以改为sendGift方法,减少冗余代码 ,Consumer<T> 中 void accept(T t);方法 需要接收一个T类型的参数
new OnlineBankingLambda().processCustomer(1337, Customer::sendCard);
}
public void processCustomer(int id, Consumer<Customer> makeCustomerHappy){
Customer c = Database.getCustomerWithId(id);
makeCustomerHappy.accept(c);
}
// dummy Customer class
static private class Customer {
public void sendGift(){
System.out.println("sendgift");
}
public void sendCard(){
System.out.println("send card");
}
}
// dummy Database class
static private class Database{
static Customer getCustomerWithId(int id){ return new Customer();}
}
}
lambda 改写观察者模式,减少冗余代码
一种简单的观察者模式
有老师和护士,当他们接收到不同的命令的时候就去做相应的事情
import java.util.ArrayList;
import java.util.List;
/**
* ClassName: MyObserv
*
* @author leegoo
* @Description:
* @date 2019年04月28日
*/
public class MyObserv {
interface Command {
String excute(String demand);
}
static class Nurse implements Command{
@Override
public String excute(String demand) {
if (demand.contains("sick")) System.out.println("receive this demand , i will help the sick" );
return demand;
}
}
static class Teacher implements Command{
@Override
public String excute(String demand) {
if (demand.contains("student")) System.out.printf("receive this demand [ %s] , i must teacher..." ,demand);
return demand;
}
}
// 订阅处理
interface Subject {
//发送消息
String send(String msg);
//增加订阅者
void add(Command command);
}
static class Human implements Subject {
private List<Command> list = new ArrayList<>();
@Override
public String send(String msg) {
list.forEach(c->c.excute(msg));
return msg;
}
@Override
public void add(Command command) {
list.add(command);
}
}
public static void main(String[] args) {
Human human = new Human();
human.add(new Teacher());
human.add(new Nurse());
human.send("student"); //receive this demand [ student] , i must teacher...
//lambda
human = new Human();
human.add((demand)->{
//可以把此处封装成一个方法 隐藏细节
if (demand.contains("sick"))
System.out.println("receive this demand , i will help the sick" );
return demand;
});
human.add((demand)->{
if (demand.contains("student"))
System.out.printf("receive this demand [ %s] , i must teacher..." ,demand);
return demand;
});
human.send("sick");
}
}
版权声明:本文为qq920447939原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。