我在和别人结对写C#代码的时候,只要有可能,我都会用list的forEach方法写循环,而不是用for-loop。同伴很不解,我打趣地说:“这完全是一个Java程序员的恶趣味,因为在Java的世界里没有Lambda”。说实话,我非常喜欢Lambda表达式,它简洁、明确、非常优雅。幸运的是,经历了Java 7的跳票之后,Java 8终于很有诚意的包含Lambda了。
Java 8 预览之Method Reference
先看一个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
在JDK的类库中,有很多只声明了一个方法的接口,比如java.lang.Iterable<T>
和java.lang.Runnable
。这些接口被称为单抽象方法接口(Single Abstract Method interfaces),它表达了一种逻辑上的单一功能约定。
Java 8为这样的接口引入了一个新概念——函数式接口(Functional Interface),同时引入注解@FunctionalInterface
以帮助编译器检查函数式接口的合法性。
Java 8 预览之Default Method
打开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);
}
}
}
IntelliJ中Java8编译错误-‘source Release 8 Requires Target Release 1.8’
在IntelliJ的Java8项目中,尽管已经将Project SDK和Project Launguage Level设置为Java 8,编译测试时仍然会出现编译错误:
java: javacTask: source release 8 requires target release 1.8 这里列出了两种解决方案…
测试金字塔(Test Pyramid)
本文翻译自Martin Fowler的著名文章‘Test Pyramid’,详细论述了敏捷测试中的金字塔结构。
- 原文: Test Pyramid
- 作者: Martin Fowler
测试金字塔概念由Mike Cohn提出,并在其著作《Succeeding with Agile》译注1中做了详细论述。其核心观点是底层单元测试应多于依赖GUI的高层端到端测试。
在我职业生涯的大部分时间中,测试自动化就是使用自动化测试工具在用户界面上操控应用程序。这些工具一般都提供录制和回放的功能,并验证应用程序返回了同样的结果。开始时,这种方式工作得很好。测试也很容易录制,即使没有程序设计经验,也可以轻松完成。
但是,这种方法很快就陷入了困境,演变成所谓的蛋卷冰淇淋。主要问题包括:基于UI的测试运行缓慢,增加了构建时间;测试自动化工具往往还需安装授权许可,这意味着这些软件只能在特定的机器上运行;通常这些测试还很难以“傻瓜”模式运行,即通过脚本执行并置入合适的部署流水线(deployment pipeline)。
Z Team 2012年度热门词汇
2013年2月7日,农历腊月廿七。在这辞旧迎新的美好时刻,Z Team 2012年度总结大会在北京隆重召开。参会的有Z Team的阿宝,晨仔,KK, 少年,xiaoyun; Z Team毕业生代表yuheng,张胖纸,风吹PP凉,以及友邻代表王胖纸。各界人士在热烈友好的气氛中就共同关心的问题深入交换意见,达成广泛共识。最后,与会各方一致评选出2012年度十大热门词汇,排名不分先后(据说只有Z Team的人才能看懂):
- 这不重要
- 你说什么
- API(A读三声)
- 反省
- 我错了
- 转一个
- 成功了
- 你是最棒的
- 弱爆了
- 你是对的
缅怀Z Team
Z Team从前年几个人到LA做Inception,到巅峰时期两个Stream近二十人的团队,再到现在算上在美国的大哥一共六个人。就像人的一生,从出生后蹒跚学步咿呀学语,到少年时充满梦想挥洒青春,最后垂垂老矣闲时缅怀旧日时光。我们都知道,总有一天,Z Team会最终消失,但我相信,那些我们共同度过的时光,会在每个人心里慢慢发酵成美好的回忆。下面的歌词改编自《同桌的你》,缅怀那些我们共同拥有的欢笑和泪水。
避免依赖Github Pages和Jekyll生成静态文件
之前用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
对我自己的博客而言,有些内容仅仅是自娱自乐,有没有人看不重要;而有的内容我希望能分享出去被更多的人看到,比如nHibernate Mapping By Code的一系列文章, 都是项目中实际总结出来的,那时候nHibernate刚刚增加Mapping By Code的方式,官方文档内容几乎没有,google搜索很少能找到精确的结果。所以,如果这些文章能 被更广泛的传播会帮助更多的人。
在用Github Pages + Jekyll搭建博客的过程中, 学到了不少SEO(Search Engine Optimization) 的知识,比如如何让博客被搜索引擎收录,需要注意哪些以提高排名等等。于是,便有了下面几条简单的总结。