java 8 的 lambda表达式
参考:
http://www.infoq.com/cn/articles/Java-se-8-lambda
http://ifeve.com/lambda/
举个栗子
/**
* 测试lambda表达式
* @author menglei
*/
public class lambda {
public static void runThreadUseLambda() {
//Runnable是一个函数接口,只包含了有个无参数的,返回void的run方法;
//所以lambda表达式左边没有参数,右边也没有return,只是单纯的打印一句话
new Thread(() ->System.out.println("lambda实现的线程")).start();
}
public static void runThreadUseInnerClass() {
//这种方式就不多讲了,以前旧版本比较常见的做法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("内部类实现的线程");
}
}).start();
}
public static void main(String[] args) {
lambda.runThreadUseLambda();
lambda.runThreadUseInnerClass();
}
}
/**
Console output:
lambda实现的线程
内部类实现的线程
*/
在宗门服务器的代码中也是这样。写一个类继承自Transaction, 构造函数中传入一个宗门id,和一个callback,而这个lambda表达式正是这个callback接口的实现。对比上面的例子,也是构造了一个内部类并实现了Runnable的run方法
举个例子,访问宗门的代码,其中lambda表达式就是实现了一个接口
interface ClanVisitor
{
void visit(Clan clan);
}
void execClanVisitor(int clanId, ClanVisitor visitor)
{
Clan clan = tryGetClan(clanId);
if (clan != null)
{
visitor.visit(clan);
return;
}
cs.getDB().execute(new LoadClanTrans(clanId, clan1 -> {
//这个lambda表达式是那个callBack,实现了一个接口
if (clan1 != null)
{
//这里由于mapClans是 concurrentHashmap,不能保证加锁,故定义一个object变量作为加锁的标志
synchronized (mapClansLock)
{
Clan memClan = mapClans.get(clanId);
if (memClan == null)
{
mapClans.put(clanId, clan1);
}
else
{
memClan.update();
clan1 = memClan;
}
}
}
visitor.visit(clan1);
}));
}
interface LoadClanTransCallback
{
void onCallback(Clan clan);
}
public class LoadClanTrans implements Transaction
{
public LoadClanTrans(int id, LoadClanTransCallback callback)
{
this.id = id;
this.callback = callback;
}
@Override
public boolean doTransaction()
{
DBClan dbclan = clan.get(id);
clanData = dbclan == null ? null : new Clan(cs, dbclan.id).fromDB(dbclan);
return true;
}
@Override
public void onCallback(ErrorCode errcode)
{
cs.getLogger().info("load clan " + id + " from DB " + (errcode == ErrorCode.eOK ? "ok" : " error " + errcode));
this.callback.onCallback(clanData);
}
@AutoInit
public TableReadonly<Integer, DBClan> clan;
private int id;
private LoadClanTransCallback callback;
private Clan clanData;
}