晚上打开电脑,想实现下午产品组同事说的新控件。Eclipse IDE自动生成Java类之后,突然发现代码的缩进居然是4,而不是2。一阵不习惯,马上改了Eclipse的设置。
完成之后,心里不免笑了笑。因为缩进为4是我从学生时代就使用的代码规范,但却在Team统一Code Convention之后的这一两个月不经意间完全改了。想想自己也是挺“固执”的,很多时候都爱坚守自己的那点小完美主义。仔细地想了想为什么会改变这个习惯,但却思索不出答案,可能是口味变了吧!
管它的,怎么顺眼怎么来!!
没事写写博客,没事拍拍照片。。。
晚上打开电脑,想实现下午产品组同事说的新控件。Eclipse IDE自动生成Java类之后,突然发现代码的缩进居然是4,而不是2。一阵不习惯,马上改了Eclipse的设置。
完成之后,心里不免笑了笑。因为缩进为4是我从学生时代就使用的代码规范,但却在Team统一Code Convention之后的这一两个月不经意间完全改了。想想自己也是挺“固执”的,很多时候都爱坚守自己的那点小完美主义。仔细地想了想为什么会改变这个习惯,但却思索不出答案,可能是口味变了吧!
管它的,怎么顺眼怎么来!!
从C++转到Java开发的这几年里,时常感慨Java里没有C++里的函数对象等好用的特性。最近安装了VS2012 Express尝鲜,偶然试了下Lambda,真是不得不惊呼“C++也能这样了!Java何时能支持原生函数对象啊!“,同时吐出几百两血,再想想悲剧的Java模板,再吐出几百两血。 😀
下面就用几个简单的例子说明一下。
1 2 3 |
auto x = [] (int a) { return 2 * a; }; cout << x(2) << endl; // 4 |
一个简单例子,很简洁的语法,就可以写出一个lambda表达式,可以赋值给auto变量或function变量。 同时发现在VS2012 Express的IDE已经对这些特性支持的非常好,自动补全也非常给力。
例子中x的类型就是function<int(int)>。
其实除了第一项和第三项,其他的部分和写个函数很像。这里就主要讲讲1、3项。
首先一个Lambda表达式可以访问所有上下文中的变量(在一个{}之内的)。Capture Clauser就是用来指定Lambda Body是按值类型访问还是引用类型访问。
举个例子:
1 2 3 4 5 6 7 8 9 |
int a = 1; int b = 2; [a, &b] { // access a by value, access b by reference. cout << a << endl; b = 3; } // a is still 1. // b is 3 now. |
如果所有变量都想以值方式访问,可以用[=];都想以引用方式访问可以用[&]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int a; int b; [=] { // 等价于[a,b] ... } [&] { // 等价于[&a, &b] ... } int c; // 如果只想c以引用方式访问 [=, &c] { // 那么就只有c是以引用方式访问 ... } |
前面的例子也说明,如果没有参数表,可以省略。
mutable关键字是和by value的访问方式有关。当我们以by value方式访问变量时,默认是不能对变量进行赋值的。但当我们声明为mutable的lambda时,就可以了。注意,这里修改的也仅仅是一个拷贝而不是值本身。
1 2 3 4 5 6 7 8 9 10 11 |
int a = 1; [=] { a = 2; // compiling error! } [=] () mutable { // parameter list can't be omitted. a = 2; // compile pass! } cout << a << endl; // still a == 1 |
1 2 3 4 |
vector<int> vec(10); generate_n(vec.begin(), 10, rand()); for_each(vec.begin(), vec.end(), [] (int a) { cout << a << endl; }); |
Lambda的加入方便了C++写出简洁的代码,可以和STL里很多算法联用,非常方便,功能强大。当然也不仅限于VS2012,新版的LLVM和GCC对lambda也支持的很好!
Java 8里会有这些吗?Who knows?
在Maven开发中,有时不能避免要使用到第三方Jar包,这些包在Maven Repo里找到不到。如何解决呢?
有两种方法。
第一种:安装到Maven Repository里。
1 |
mvn install:install-file -Dfile=D:\lib.jar -DgroupId=org.yli.lib -DartifactId=lib1 -Dversion=1.3 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true |
这样lib.jar会被安装到Maven的本地Repo里,坐标就是org.yli.lib:lib1:jar:1.3。在使用它的POM里就可以写:
1 2 3 4 5 6 |
<dependency> <groupId>org.yli.lib</groupId> <artifactId>lib1</artifactId> <version>1.3</version> <packaging>jar</packaging> </dependency> |
这种作法的缺点就是还不够灵活。除非把包安装到内部的Maven服务器上,不然团队统一就需要都安装相同的包。
第二种:使用<scope>system</scope>
如果没有内部的Maven服务器,但有个第三方包,团队可以从代码服务上下载到本地,我们可以通过设置<scope>system</scope>属性来设置dependency.
1 2 3 4 5 6 7 8 |
<dependency> <groupId>org.yli.lib</groupId> <artifactId>lib1</artifactId> <version>1.3</version> <packaging>jar</packaging> <scope>system</scope> <systemPath>${project.basedir}/lib.jar</systemPath> </dependency> |
如果你是一个多Module工项,project.basedir对于每个Project都不一样,但我们可以把这些依赖放到Parent Module里的dependencyManagement里,这样其他的Sub Module就可以不用再设置具体信息了。
这个问题需要写一下,怕以后忘了。
Jenkin最近在Sonar集成上出错了,信息大概是说”同时有几个Snapshot“。Snapshot就是质量快照,应该是每次Build产生一个,保存在Sonar的数据库里,然后用于Sonar的分析。
在尝试了自己手动删除Snapshot不行之后,在网上(Here)找到解决的办法。这个错误的原因是Sonar不支持对同一个项目同时进行Sonar分析,应该属于某种并发的问题。
解决方法就是执行一段SQL语句:
MySQL
1 |
update snapshots old_snap, snapshots new_snap set old_snap.islast=0 where old_snap.islast=1 and new_snap.created_at > old_snap.created_at and new_snap.project_id = old_snap.project_id and new_snap.islast=1 |
Oracle
1 |
update sonar.snapshots old_snap set old_snap.islast=0 where islast=1 and exists(select * from sonar.snapshots new_snap where new_snap.created_at > old_snap.created_at and new_snap.project_id = old_snap.project_id and new_snap.islast=1) |
PostgreSql
1 |
update snapshots old_snap set islast=false where islast=true and exists(select * from snapshots new_snap where new_snap.created_at > old_snap.created_at and new_snap.project_id = old_snap.project_id and new_snap.islast=true) |
搞定了!Cheers!