Zhenyu’s Blog

陌上发花,可以缓缓醉矣, 忍把浮名,换了浅酌低唱。

Java 8 预览之Lambda表达式

| Comments

我在和别人结对写C#代码的时候,只要有可能,我都会用list的forEach方法写循环,而不是用for-loop。同伴很不解,我打趣地说:“这完全是一个Java程序员的恶趣味,因为在Java的世界里没有Lambda”。说实话,我非常喜欢Lambda表达式,它简洁、明确、非常优雅。幸运的是,经历了Java 7的跳票之后,Java 8终于很有诚意的包含Lambda了。

Lambda表达式其实就是匿名函数,它可以作为参数传递给高阶函数供其调用。

Java 8 预览之Method Reference

| Comments

先看一个Lambda表达式的例子:

Arrays.asList("Windows", "Mac OSX").forEach(x -> System.out.println(x));

既然Lambda表达式x->System.out.println(x)相当于匿名函数(接受一个String类型的参数,无返回值),那么对于其使用者forEach而言,传给它一个匿名函数还是有名字的函数其实没有区别,只要这个函数满足forEach的参数规约即可。而且很多时候有名字的函数反而可读性更好并且更利于代码重用。如此说来,Java 8 引入方法引用(Method Reference)也就顺理成章了。上面的代码用方法引用可以写成:

Arrays.asList("Windows", "Mac OSX").forEach(System.out::println);

Java 8 预览之Functional Interface

| Comments

在JDK的类库中,有很多只声明了一个方法的接口,比如java.lang.Iterable<T>java.lang.Runnable。这些接口被称为单抽象方法接口(Single Abstract Method interfaces),它表达了一种逻辑上的单一功能约定。

Java 8为这样的接口引入了一个新概念——函数式接口(Functional Interface),同时引入注解@FunctionalInterface以帮助编译器检查函数式接口的合法性。

Java 8 预览之Default Method

| Comments

打开JDK 8的源代码,你会发现很多接口中多了一些标记为default的方法。在Java的早期版本中,default关键字只在switch语句中使用,在方法上使用代表什么含义呢?让我们一起来看一下Java 8新特性:Default Method

何为Default Method

默认方法(Default Method),又称虚拟扩展方法(Virtual Extension Methods)或保卫者方法(Defender Method),是JSR 335的一部分。让我们先看一下JDK中的实际例子:

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
}

测试金字塔(Test Pyramid)

| Comments

本文翻译自Martin Fowler的著名文章‘Test Pyramid’,详细论述了敏捷测试中的金字塔结构。


测试金字塔概念由Mike Cohn提出,并在其著作《Succeeding with Agile》译注1中做了详细论述。其核心观点是底层单元测试应多于依赖GUI的高层端到端测试。

Test Pyramid

在我职业生涯的大部分时间中,测试自动化就是使用自动化测试工具在用户界面上操控应用程序。这些工具一般都提供录制和回放的功能,并验证应用程序返回了同样的结果。开始时,这种方式工作得很好。测试也很容易录制,即使没有程序设计经验,也可以轻松完成。

但是,这种方法很快就陷入了困境,演变成所谓的蛋卷冰淇淋。主要问题包括:基于UI的测试运行缓慢,增加了构建时间;测试自动化工具往往还需安装授权许可,这意味着这些软件只能在特定的机器上运行;通常这些测试还很难以“傻瓜”模式运行,即通过脚本执行并置入合适的部署流水线(deployment pipeline)。

Z Team 2012年度热门词汇

| Comments

2013年2月7日,农历腊月廿七。在这辞旧迎新的美好时刻,Z Team 2012年度总结大会在北京隆重召开。参会的有Z Team的阿宝,晨仔,KK, 少年,xiaoyun; Z Team毕业生代表yuheng,张胖纸,风吹PP凉,以及友邻代表王胖纸。各界人士在热烈友好的气氛中就共同关心的问题深入交换意见,达成广泛共识。最后,与会各方一致评选出2012年度十大热门词汇,排名不分先后(据说只有Z Team的人才能看懂):

  • 这不重要
  • 你说什么
  • API(A读三声)
  • 反省
  • 我错了
  • 转一个
  • 成功了
  • 你是最棒的
  • 弱爆了
  • 你是对的

缅怀Z Team

| Comments

z_team

Z Team从前年几个人到LA做Inception,到巅峰时期两个Stream近二十人的团队,再到现在算上在美国的大哥一共六个人。就像人的一生,从出生后蹒跚学步咿呀学语,到少年时充满梦想挥洒青春,最后垂垂老矣闲时缅怀旧日时光。我们都知道,总有一天,Z Team会最终消失,但我相信,那些我们共同度过的时光,会在每个人心里慢慢发酵成美好的回忆。下面的歌词改编自《同桌的你》,缅怀那些我们共同拥有的欢笑和泪水。

避免依赖Github Pages和Jekyll生成静态文件

| Comments

之前用Github Pages + Jekyll搭建了自己的博客,有一次玩Jekyll插件之后,博客里所有使用Pygments的代码高亮都不工作了, 即使revert代码也无济于事,更奇怪的是,本地运行jekyll完全没问题,折腾很久都没有解决… 最后,我只好采取了终极解决方案了。

Github Pages的文档上说,当前(2012年9月)使用的是 Jekyll 0.11.0和Liquid 2.2.2,并且使用下面命令运行:

$ jekyll --pygments --no-lsi --safe

Github Pages + Jekyll搭建博客之SEO

| Comments

对我自己的博客而言,有些内容仅仅是自娱自乐,有没有人看不重要;而有的内容我希望能分享出去被更多的人看到,比如nHibernate Mapping By Code的一系列文章, 都是项目中实际总结出来的,那时候nHibernate刚刚增加Mapping By Code的方式,官方文档内容几乎没有,google搜索很少能找到精确的结果。所以,如果这些文章能 被更广泛的传播会帮助更多的人。

在用Github Pages + Jekyll搭建博客的过程中, 学到了不少SEO(Search Engine Optimization) 的知识,比如如何让博客被搜索引擎收录,需要注意哪些以提高排名等等。于是,便有了下面几条简单的总结。