MENU

Keep It Stupid Simple

Spring Cloud(一) 微服务与 Spring Cloud

微服务通过分解大型单体式应用为多个服务来解决复杂性问题;在业务功能不变的情况下,应用被分解为多个可管理的服务,每个服务都有一个用RPC或者消息驱动API定义的边界;微服务架构模式给采用单体编码方式很难实现的功能提供了模块化的解决方案,由此,单个服务更易开发、理解和维护。微服务架构使得每个服务都可以有专门开发团队来开发,开发者可以自由选择开发技术,提供API服务;因为微服务应用都相对简单,进行代码重构、重写也更简单。微服务架构每个服务独立部署,开发者再需要协调其它服务部署对本服务的影响,更易部署。对于每个微服务,可以更定制化的配置硬件资源,更合理地利用资源。

Read More

FreeMarker格式化数字的坑

周一下午群里有运营反馈导出的单据中总金额和每项目金额加起来对上,差了一毛钱;目测是我的问题,赶紧回了句“稍等,正在看。。。”就去看代码了,心想着这块应该不涉及四舍五入的问题,当时产品和各业务线约定的是一位小数,理论上不会出现问题;万万没想到,返回数据中有些是两位小数。

当时为了快速上线,代码写的不严谨,肯定是没保留一位小数先累加导致的;比如,三个100.04求和后变成了300.1,但每项都是100,就差了0.1。不过看了实际数据后,发现不是这个问题导致的;实际数据总共有三条100200.5100.05,页面显示的是100.0200.5100.0,总金额400.6

Read More

Java 8 学习笔记(二)Lambda与Stream

实践数据如下,电影列表:包括名称、评分、时长、年份和演员列表。

Movie(name=无极, score=5.0, duration=121, year=2005, 
actorList=[Actor(name= 张东健, birthday=1972-03-07), Actor(name=张柏芝, birthday=1980-05-24), Actor(name=真田广之, birthday=1960-10-12), Actor(name=谢霆锋, birthday=1980-08-29), Actor(name=刘烨, birthday=1978-03-23)])

Movie(name=救火英雄, score=7.2, duration=115, year=2014, 
actorList=[Actor(name=谢霆锋, birthday=1980-08-29), Actor(name=余文乐, birthday=1981-11-13), Actor(name=任达华, birthday=1955-03-19), Actor(name=胡军, birthday=1968-03-18)])

Movie(name=喜剧之王, score=8.6, duration=85, year=1999, 
actorList=[Actor(name=周星驰, birthday=1962-06-22), Actor(name=张柏芝, birthday=1980-05-24), Actor(name=莫文蔚, birthday=1970-06-02)])

Movie(name=大话西游之月光宝盒, score=8.9, duration=87, year=1995, 
actorList=[Actor(name=周星驰, birthday=1962-06-22), Actor(name=吴孟达, birthday=1952-01-02), Actor(name=罗家英, birthday=1947-08-27), Actor(name=蓝洁瑛, birthday=1963-04-27), Actor(name=莫文蔚, birthday=1970-06-02)])

Stream化

计算评分不小于8.0的电影数量,在jdk 1.8 之前可以使用for循环或者Iterator来实现

int count = 0;
BigDecimal score = new BigDecimal("8.0");
for (Movie movie : movieList) {
    if (movie.getScore().compareTo(score) >= 0) {
        count++;
    }
}
System.out.println(count);

在jdk 1.8 中,调用stream()方法创建一个Stream,使用filter方法过滤,并不会改变列表的内容,而是返回一个新的Stream,最后调用count()方法计算个数。

long count = movieList.stream().filter(movie -> movie.getScore().compareTo(score) >= 0).count();
System.out.println(count);

Read More

Java 8 学习笔记(一)Hello Lambda

在Android、Swing中,会经常看到类似代码;将行为包装成一个对象(匿名内部类)进行传递。为了传递一行逻辑代码,需要额外样板代码,而且可读性较差。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show();
    }
});

在Java 8中引入了lambda表达式,Lambda可以简单理解为一个代码块,我们可以直接把Lambda作为参数传给方法;在上述代码中,我们可以直接传递行为代码,而不需要构造一个匿名内部类:

button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show());

Read More