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代码中,它是如何写入的?
答案 0 :(得分:2)
这样做:
workRunnable = () -> search(s.toString());
与做:
相同workRunnable = new Runnable() {
@Override
public void run() {
search(s.toString());
}
};
实际上,低级实现是不同的,lambdas不仅仅是编译器添加的语法糖,即它们不会在内部转换为匿名内部类。然而,当匿名内部类扩展功能接口(只有一个抽象方法的接口)时,从语义的角度来看,两者都意味着几乎相同。
一个不同之处在于,在匿名内部类中,如果您引用this
,您将引用匿名内部类的实例,而在lambda中,如果您引用this
,您将引用定义lambda的封闭类的实例。
您可能需要阅读lesson about lambdas in The Java Tutorial,其中解释了lambda以及如何使用它们。
答案 1 :(得分:0)
Lambdas是单个方法接口的匿名实现。它们可以是任何单个方法接口,但内置接口包括:
() -> 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中使用,即Function for Stream :: map可以是任何需要K并返回V的代码。 一个限制是内置接口不会抛出异常,因此如果要使用抛出异常的lambda,则必须滚动自己的接口。