Lambda表达式中的Java代码是什么意思?

时间:2017-05-26 02:31:00

标签: java lambda

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代码中,它是如何写入的?

2 个答案:

答案 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,则必须滚动自己的接口。