java中的lambda表达式

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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值