习惯

晚上打开电脑,想实现下午产品组同事说的新控件。Eclipse IDE自动生成Java类之后,突然发现代码的缩进居然是4,而不是2。一阵不习惯,马上改了Eclipse的设置。

完成之后,心里不免笑了笑。因为缩进为4是我从学生时代就使用的代码规范,但却在Team统一Code Convention之后的这一两个月不经意间完全改了。想想自己也是挺“固执”的,很多时候都爱坚守自己的那点小完美主义。仔细地想了想为什么会改变这个习惯,但却思索不出答案,可能是口味变了吧!

管它的,怎么顺眼怎么来!!

 

Visual Studio 2012 C++里的Lambda

从C++转到Java开发的这几年里,时常感慨Java里没有C++里的函数对象等好用的特性。最近安装了VS2012 Express尝鲜,偶然试了下Lambda,真是不得不惊呼“C++也能这样了!Java何时能支持原生函数对象啊!“,同时吐出几百两血,再想想悲剧的Java模板,再吐出几百两血。 😀

下面就用几个简单的例子说明一下。

一个例子

一个简单例子,很简洁的语法,就可以写出一个lambda表达式,可以赋值给auto变量或function变量。 同时发现在VS2012 Express的IDE已经对这些特性支持的非常好,自动补全也非常给力。

例子中x的类型就是function<int(int)>。

Lambda的基本语法

  1. Lambda introducer或Capture Clauser
  2. Parameter list 声名lambda参数表的
  3. Mutable specification
  4. Exception specification 声名异常
  5. Return type clause 返回值
  6. Lambda body 函数体

其实除了第一项和第三项,其他的部分和写个函数很像。这里就主要讲讲1、3项。

首先一个Lambda表达式可以访问所有上下文中的变量(在一个{}之内的)。Capture Clauser就是用来指定Lambda Body是按值类型访问还是引用类型访问。
举个例子:

如果所有变量都想以值方式访问,可以用[=];都想以引用方式访问可以用[&]。

前面的例子也说明,如果没有参数表,可以省略。

mutable关键字是和by value的访问方式有关。当我们以by value方式访问变量时,默认是不能对变量进行赋值的。但当我们声明为mutable的lambda时,就可以了。注意,这里修改的也仅仅是一个拷贝而不是值本身。

和STL算法联用

 

Lambda的加入方便了C++写出简洁的代码,可以和STL里很多算法联用,非常方便,功能强大。当然也不仅限于VS2012,新版的LLVM和GCC对lambda也支持的很好!

Java 8里会有这些吗?Who knows?

References

  1. Examples of Lambda Expressions
  2. Lambda Expression Syntax

在Maven构建环境中使用第三方Jar包

在Maven开发中,有时不能避免要使用到第三方Jar包,这些包在Maven Repo里找到不到。如何解决呢?

有两种方法。

第一种:安装到Maven Repository里。

这样lib.jar会被安装到Maven的本地Repo里,坐标就是org.yli.lib:lib1:jar:1.3。在使用它的POM里就可以写:

这种作法的缺点就是还不够灵活。除非把包安装到内部的Maven服务器上,不然团队统一就需要都安装相同的包。

第二种:使用<scope>system</scope>

如果没有内部的Maven服务器,但有个第三方包,团队可以从代码服务上下载到本地,我们可以通过设置<scope>system</scope>属性来设置dependency.

如果你是一个多Module工项,project.basedir对于每个Project都不一样,但我们可以把这些依赖放到Parent Module里的dependencyManagement里,这样其他的Sub Module就可以不用再设置具体信息了。

Sonar上出现多个Snapshot错误的解决方法

这个问题需要写一下,怕以后忘了。

Jenkin最近在Sonar集成上出错了,信息大概是说”同时有几个Snapshot“。Snapshot就是质量快照,应该是每次Build产生一个,保存在Sonar的数据库里,然后用于Sonar的分析。

在尝试了自己手动删除Snapshot不行之后,在网上(Here)找到解决的办法。这个错误的原因是Sonar不支持对同一个项目同时进行Sonar分析,应该属于某种并发的问题。

解决方法就是执行一段SQL语句:

MySQL

Oracle

PostgreSql

搞定了!Cheers!