[英]What does this Java code in Lambda expression mean?
Handler handler = new Handler(Looper.getMainLooper() );
Runnable workRunnable;
@Override public void afterTextChanged(Editable s) {
handler.removeCallbacks(workRunnable);
workRunnable = () -> search(s.toString());
handler.postDelayed(workRunnable, 500 /*delay*/);
}
这个表达是什么意思?
workRunnable = () -> search(s.toString());
在普通的Java代码中,它是如何编写的?
这样做:
workRunnable = () -> search(s.toString());
与执行相同:
workRunnable = new Runnable() {
@Override
public void run() {
search(s.toString());
}
};
实际上,低级实现是不同的,lambda不仅仅是编译器添加的语法糖,即,它们未在内部转换为匿名内部类。 但是,当匿名内部类扩展功能接口 (只有一种抽象方法的接口)时,从语义的角度来看,两者的含义几乎相同。
一个区别是,在匿名内部类中,如果引用this
,则将引用匿名内部类的实例;而在lambda中,如果引用this
,则将引用封闭的类的实例,其中lambda已定义。
您可能想阅读The Java Tutorial中有关lambda的课程 ,其中解释了lambda及其使用方法。
Lambda是单方法接口的匿名实现。 它们可以是任何单一方法接口,但内置的接口包括:
() -> doSomethingButDonTReturnAnything() // Runnable
() -> returnV() // Supplier<V>
x -> doSomethingWithXButDontRetunAnything(x) // Consumer<K>
x -> returnVFromX(x) // Function<K,V>
(x, y) -> doSomethingWithXAndYButDontReturnAnything(x,y) // BiConsumer<K,V>
(x, y) -> doSomethingWithXAndYAndReturnM(x, y) // BiFunction<K,V,M>
()仅表示没有输入参数。 也有诸如IntFunction和Predicate之类的原始版本。 任何实现所需接口的代码都可以在lambda内使用,即Stream :: map的函数可以是带K并返回V的任何东西。一个限制是内置接口不会引发异常,因此您必须如果要使用引发异常的lambda,请滚动自己的接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.