繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM