java中lambda用法,java lambda函数

http://www.itjxue.com  2023-01-04 15:34  来源:未知  点击次数: 

lamda表达式 方法参数

Java Lambdas和单一方法接口

函数式编程通常用于实现事件监听器。Java中的事件监听器通常被定义为带有单个方法的Java接口。这里有一个单一方法接口示例:

public interface StateChangeListener {

public void onStateChange(State oldState, State newState);

}

这个Java接口定义了一种方法,该方法在状态改变时调用(不管被观察到的是什么)。

在Java 7中,为了侦听状态更改,您必须实现这个接口。假设您有一个名为StateOwner的类,它可以注册状态事件监听器。这是一个例子:

public class StateOwner {

public void addStateListener(StateChangeListener listener) { ... }

}

在Java 7中,可以用匿名接口实现添加事件监听器:

StateOwner stateOwner = new StateOwner();

stateOwner.addStateListener(new StateChangeListener() {

public void onStateChange(State oldState, State newState) {

// do something with the old and new state.

}

});

首先创建StateOwner实例。然后StateChangeListenerinterface的一个匿名实现被作为监听器被添加在StateOwner实例中。

在Java 8中,您可以使用Java lambda表达式添加事件监听器,如下所示:

StateOwner stateOwner = new StateOwner();

stateOwner.addStateListener(

(oldState, newState) - System.out.println("State changed")

);

lambda表达式是这部分:

(oldState, newState) - System.out.println("State changed")

lambda表达式与addStateListener()方法的参数类型相匹配。如果lambda表达式匹配参数类型(在这种情况下,是StateChangeListenerinterface),lambda表达式将转换成实现该参数接口的函数。

Java lambda表达式只能在匹配的类型只是单方法接口的时候使用。在上面的示例中,使用lambda表达式作为参数,参数类型为StateChangeListener接口。这个接口只有一个方法。因此,lambda表达式与该接口成功匹配。

Lambdas匹配接口

单个方法接口有时也被称为函数式接口。将Java lambda表达式与函数接口相匹配分为以下步骤:

?接口只有一个方法吗?

?lambda表达式参数是否与单方法参数匹配?

?lambda表达式的返回类型是否与单方法的返回类型匹配?

如果对这三个问题的回答是肯定的,那么给定的lambda表达式与接口成功匹配。

Lambda 类型推断

在Java 8之前,实现匿名接口前,必须指定要实现的接口。以下是本文开头的匿名接口实现示例:

stateOwner.addStateListener(new StateChangeListener() {

public void onStateChange(State oldState, State newState) {

// do something with the old and new state.

}

});

在lambda表达式中,类型通常可以从周围的代码中推断出来。例如,可以从addStateListener()方法的方法声明中推断参数的接口类型(StateChangeListener接口上的单一方法)。这就是所谓的类型推断。编译器通过查找其他类型的参数来推断参数的类型—在本例中是方法定义。这是本文开始的例子,StateChangeListenerinterface并未在lambda表达式提及:

stateOwner.addStateListener(

(oldState, newState) - System.out.println("State changed")

);

在lambda表达式中,参数类型通常也可以推断出来。在上面的例子中,编译器可以从onStateChange()方法声明中推断出它们的类型。因此,从onStateChange()方法的方法声明中推断出参数oldState和newState的类型。

Lambda 参数

由于Java lambda表达式实际上只是方法,lambda表达式可以像方法一样接受参数。前面显示的lambda表达式的(oldState,newState)部分指定lambda表达式所采用的参数。这些参数必须与单一方法接口上的方法参数相匹配。在此例中,这些参数必须与StateChangeListener接口的onStateChange()方法的参数相匹配:

public void onStateChange(State oldState, State newState);

lambda表达式和方法参数数量必须匹配。

其次,如果您在lambda表达式中指定了任何参数类型,那么这些类型也必须匹配。我还没有向您展示如何在lambda表达式设置类型(稍后将在本文中展示),在很多情况下您并不需要它们。

0 参数

如果匹配lambda表达式的方法没有参数,则可以像这样编写lambda表达式:

() - System.out.println("Zero parameter lambda");

注意括号之间没有内容。这表示lambda没有参数。

单个参数

如果方法与Java lambda表达式相匹配,那么您可以编写这样的lambda表达式:

java lambda表达式是什么?

lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

函数式接口:

这个是理解Lambda表达式的重点,也是产生lambda表达式的“母体”,这里我们引用一个比较容易理解的说法:函数式接口是 一个只有一个抽象方法(不包含object中的方法)的接口。

这个需要说明一点,就是在Java中任何一个对象都来自Object 所有接口中自然会继承自Object中的方法,但在判断是否是函数式接口的时候要排除Object中的方法。

java lambda有什么用

lambda,匿名表达式,举个例子来说

以前写代码

xx.doSomething(new?CallBack(){

????public?void?do(){

????????//?do?something

????}

});

使用lambda的写法:

xx.doSomething(()?-?{//?do?something});

Java中的lambda,主要是为了支持函数式编程,只有在Java 8中才引入了lambda

java的lambda表达式应用在哪些场合

例1、用lambda表达式实现Runnable

我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这里做了什么呢?那就是用() - {}代码块替代了整个匿名类。

// Java 8之前:

new Thread(new Runnable() {

@Override

public void run() {

System.out.println("Before Java8, too much code for too little to do");

}

}).start();

//Java 8方式:

new Thread( () - System.out.println("In Java8, Lambda expression rocks !!") ).start();

输出:

too much code, for too little to do

Lambda expression rocks !!

这个例子向我们展示了Java 8 lambda表达式的语法。你可以使用lambda写出如下代码:

(params) - expression

(params) - statement

(params) - { statements }

例如,如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:

() - System.out.println("Hello Lambda Expressions");

如果你的方法接收两个参数,那么可以写成如下这样:

(int even, int odd) - even + odd

顺便提一句,通常都会把lambda表达式内部变量的名字起得短一些。这样能使代码更简短,放在同一行。所以,在上述代码中,变量名选用a、b或者x、y会比even、odd要好。

例2、使用Java 8 lambda表达式进行事件处理

如果你用过Swing API编程,你就会记得怎样写事件监听代码。这又是一个旧版本简单匿名类的经典用例,但现在可以不这样了。你可以用lambda表达式写出更好的事件监听代码,如下所示:

// Java 8之前:

JButton show = new JButton("Show");

show.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.println("Event handling without lambda expression is boring");

}

});

// Java 8方式:

show.addActionListener((e) - {

System.out.println("Light, Camera, Action !! Lambda expressions Rocks");

});

Java开发者经常使用匿名类的另一个地方是为 Collections.sort() 定制 Comparator。在Java 8中,你可以用更可读的lambda表达式换掉丑陋的匿名类。我把这个留做练习,应该不难,可以按照我在使用lambda表达式实现 Runnable 和 ActionListener 的过程中的套路来做。

例3、使用lambda表达式对列表进行迭代

(责任编辑:IT教学网)

更多