Java函数式编程(一)

前言

如果你对Lambda表达式感兴趣,想知道它怎么帮助你提升专业技能,那么,看到这篇文章就对了!我们假设大家还不知道Lambda表达式,以及Java的核心类库的变化,我们将从“零”开始介绍这些概念、类库和技术。

Standing on Shoulders of Giants

站在巨人的肩膀上

What?

每个人对函数式编程的理解不尽相同。但其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。

Demo

我们都知道Swing是一个与平台无关的Java类库,用来编写图形用户界面(GUI)。该类库有一个常见用法:为了响应用户操作,需要注册一个事件监听器。用户一输入,监听器就会执行一些操作,如图:

button.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent event){                       System.out.println("button clicked");             }  });                                                                                

在这个例子中,我们创建了一个新对象,它实现了ActionListener接口。这个接口只有一个方法actionPerformed,当用户点击屏幕上的按钮时,button就会调用这个方法。在该例中,该方法所执行的只是输出一条信息,表明按钮已被点击。

设计匿名内部类的目的,就是为了方便Java程序员们将代码作为数据传递。不过,匿名内部类还是不够方便。为了调用一行重要的逻辑代码,不得不加上4行冗繁的样板代码。

尽管如此,样板代码并不是唯一的问题:这些代码还相当难读,因为它没有清楚地表达程序员的意图。( ̄▽ ̄)"

我们不想传入对象,只想传入行为

但是,我们却可以把上述代码写成一个Lambda表达式,如图:

(使用Lambda表达式将行为和按钮单击进行关联)

button.addActionListener(event -> System.out.println("button clicked"));                                     

和传入一个实现某接口的对象不同,我们传入了一段代码块——一个没有名字的函数。event时参数名,和上面匿名内部类示例中的是同一个参数。->将参数和Lambda表达式的主体分开,而主体是用户点击按钮时会运行的一些代码。

和使用匿名内部类的另一处不同在于声明event参数的方式。使用匿名内部类时需要显式地声明参数类型ActionEvent event,而在Lambda表达式中无需指定类型,程序依然可以编译。这是因为javac根据程序的上下(addActionListen

er 方法的签名 )在后台推断出了参数event的类型。这意味着如果参数类型不言而明,则无需显式指定。以后我们会介绍类型介绍的更多细节。

尽管与之前相比,Lambda表达式中的参数需要的样板代码很少,但是Java仍然是一种静态类型语言。为了增加可读性并迁就我们的习惯,声明参数时也可以包括类型信息,而且有时编译器不一定能根据上下文推断出参数的类型!

今日小结

• Lambda表达式是一个匿名方法,将行为像数据一样进行传递。

今日名言

• 一种新技术一旦开始流行,你要么坐上压路机,要么成为铺路石。(Stewart Brand)