MENU

Keep It Stupid Simple

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

mac 安装 TensorFlow

为了方便包管理器和环境管理,建议先安装Anaconda,如果官网打不开或者下载太慢,可以使用清华大学的镜像站https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/。安装完成后,运行conda info命令能够正常显示信息,说明安装成功;如果提示找不到命令,可能是更换了bash导致的,因为Anaconda安装时将环境变量添加到了.bash_profile中,将

Read More

Centos7报错Failed to set locale, defaulting to C

在新安装的centos7环境中,执行yum报错Failed to set locale, defaulting to C;使用locale命令查看语言环境:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

Read More

mac搭建Vagrant环境

开发过程中,环境配置不一致经常导致一些问题,本地运行正常,到测试、生产环境却出现了问题。所以,一套和线上环境配置一致的本地开发环境是很有必要的。在虚拟机中搭建一套和线上环境一致的虚拟环境,能够有些避免类似问题;尤其在团队开发中,一致的开发环境能够减少很多不必要的问题。不过,单纯使用VMware、VirtualBox或者Parallels在做开发环境标准化时有些困难,团队中每个人按照要求在虚拟机中搭建一遍,既费时又费力。Vagrant作为一个虚拟机管理工具,很好的解决了这些问题,基于命令行更轻便的操作虚拟机,实现快速的虚拟机镜像分发和使用,团队中打包一个box,就可以分发给所有人使用。

Vagrant提供的共享文件夹、端口转发等功能,对于在主机上写程序,在虚拟环境中调试来说是非常有用;可以将代码放到共享目录,方便虚拟环境调试,把日志文件放到共享目录,方便主机查看。在模拟分布式环境时,同时配置启动多台虚拟机也非常方便。Vagrant环境的搭建比较简单,可以使用Vagrant+VirtualBox组合,也支持Vagrant+VMware、Parallels这种组合。

Read More