Flask接口签名sign原理与实例代码浅析
219
2023-07-05
Java8 Lambda表达式详解及实例
第一个Lambda表达式
在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello runnable");
}
};
...
thread.start();
上面的例子如果改成使用Lambda就会简单许多:
Runnable noArgs = ()->System.out.println("Hello Lambda!~"XMsuYV);
...
thread.start();
Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参数部分,后面这是主体部分。
Lambda的其它形式
BinaryOperator
//OR
BinaryOperator
//OR
BinaryOperator
x+y;
};
Lambda表达式使用 () 表示没有参数。
如果Lambda表达式中只包含一个参数,可省略掉 () 。
如果Lambda表达式的主题是一段代码块,需要使用 {} ,该代码块与普通的java代码块并无区别,也可以返回或抛出异常。
如果参数的类型可以由编译器推断得出可以省略参数类型XMsuYV,当然你也可以加上。
以上就是Lambda表达式的所有形式了。
那么问题来了:
BinaryOperator
这行代码并不是讲个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。而add的类型是 BinaryOperator
BinaryOperator
Long res = add.apply(3L, 4L);
System.out.println("res="+res);//输出:res=7
函数接口
函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型。
如 Runnable 就是一个函数接口。
新建一个我们自己的函数接口:
public interface AddOperator
long add(T one,D two);
}
使用:
AddOperator
System.err.println("Custom function listener res= "+addOperator.add(34L, 65L));
目标类型
目标类型是指Lambda表达式所在上下文环境的类型。比http://如,将Lambda表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是Lambda表达式的目标类型。
final
如果我们在匿名内部类中引用了所在方法中的局部变量,这是需要局部变量是 final 的。
在Lambda中我们不需要将引用的外部局部变量声明为 finhttp://al 的,但是该变量只能被赋值一次。
下面的例子中如果我们去掉注释,对name再次赋值,则无法通过编译,并显示出错信息: local variables referenced from a Lambda expression must be final or effectively final.
Lambda表达式引用的局部变量必须是final或即成事实的final。
String name = getUserName();
//name="hi";
button.addActionListener(event->System.out.println("name="+name));
类型推断
Lambda表达式的类型推断是Java7中就引入的目标类型推断的扩展。
java7中的类型推断:
List
上例中我们并没有指定ArrayList的范型类型,而是根据list的类型,推断出了ArrayList的范性类型。
如: AddOperator
通过此文,希望能帮助到大家,学习理解,此部分知识,谢谢大家对本站的支持!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~