【爱上Java8】一步一步走进 java8 lambda表达式

来源:互联网 发布:mysql数据库服务器配置 编辑:程序博客网 时间:2024/05/17 03:20

Java的lambda表达式可以大大简化Java的代码,Java令人诟病的一个地方就是,代码太繁琐,同样的功能使用pythong语言实现,可能只需要1/10的代码就可以完成,但是使用Java写,却会有一段的“废话”,令人很不爽,因此,java8引入了lambda表达式,致力于解决这个问题。
下面用一个简单的例子说明,比如我们要遍历一个集合,最麻烦的写法是:

1
2
3
4
5
final List<String> friends =
        Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
for(int i = 0; i < friends.size(); i++) {
    System.out.println(friends.get(i));
}

稍微改进一下,就变成

1
2
3
4
5
final List<String> friends =
        Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
for(String name : friends) {
    System.out.println(name);
}

在Java8中,提供了一个forEach接口,来实现类似的遍历功能:

1
2
3
4
5
6
7
final List<String> friends =
        Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
friends.forEach(new Consumer<String>() {
    public void accept(final String name) {
    System.out.println(name);
    }
});

初一看,更加麻烦了,但这个只是原始版本。这个forEach就是有点点函数式编程的味道,它接收一个接口,用来处理集合里的数据。这个接口的部分定义如下:

1
2
3
4
@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

关注一下那个FunctionalInterface,表示这个是一个函数式的接口,这种接口,就可以用来函数式编程,做成一些lambda表达式之类的。
基于这个函数式的接口,我们可以简化上面的写法:

1
2
3
final List<String> friends =
    Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
friends.forEach((final String name) -> System.out.println(name));

这样看起来是不是方便很多了?->的左边表示参数类型和参数名字,右边是接口的实现,java会帮你生成那个函数式接口的一个匿名类。
这还没完,可以接续简化:

1
2
3
final List<String> friends =
        Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
friends.forEach((name) -> System.out.println(name));

因为java都已经知道了是什么接口,参数类型当然知道啦,所以没必要写出来,所以可以省略了,这样是不是更简单呢?
这还没完呢,既然是函数式接口,Java知道了接口的定义,参数,以及参数类型都知道了,为什么还要累赘的写出来呢,大家不是觉得java很繁琐吗?那么现在,将简洁进行到底吧!

1
2
3
final List<String> friends =
        Arrays.asList("Brian""Nate""Neal""Raju""Sara""Scott");
friends.forEach(System.out::println);

好了,这些连参数也省了。一句话就遍历了一个集合,就指名了一个方法的引用。
可以看到java还是努力再改变自己,但是从我个人的感觉出发,我觉得写到这样就差不多了

1
friends.forEach((name) -> System.out.println(name));

省略太多,其实对可读性来说并不是太好。毕竟代码是写给人看的。
今天就说到这里,以后有时间,会继续分享一些java8的新特性。

0 0