Java是否有类似Kotlin的简便Lambda变量声明方式?
Kotlin中的Lambda写法示例
val myLambda: (Int, Int) -> Unit = { a, b -> Log.d(TAG, "sum value = ${a + b}") } myLambda(1, 2)//调用Lambda
Java中的两种实现方式
方式一:Runnable
这种方法的问题是Runnable无法接收参数。
// Runnable方式 Runnable runnable = () -> { System.out.println("x"); }; runnable.run();
方式二:自定义接口
这种方法的问题是我需要为不同类型声明多个接口。
// 自定义接口方式 Finder finder = (s1, s2) -> s1.indexOf(s2); System.out.println(finder.find("1234", "23")); public interface Finder { public int find(String s1, String s2); }
问题与解答
作为Java新手,想请教是否存在比这两种方法更简便的Lambda实现方式?
当然有,Java 8及以后提供了大量内置的函数式接口,可以直接复用,不用自己定义新接口,完美解决你提到的两个问题:
- 如果你需要实现接收两个参数、无返回值的逻辑(对应Kotlin示例里的
(Int, Int) -> Unit),可以用BiConsumer接口:
// 使用BiConsumer实现类似Kotlin的求和打印逻辑 BiConsumer<Integer, Integer> sumPrinter = (a, b) -> { System.out.println("sum value = " + (a + b)); }; sumPrinter.accept(1, 2);
- 如果你需要接收参数并返回结果(比如自定义Finder的场景),可以根据参数和返回值的数量选择对应接口:
- 接收两个参数、返回一个结果用
BiFunction:
- 接收两个参数、返回一个结果用
BiFunction<String, String, Integer> finder = (s1, s2) -> s1.indexOf(s2); System.out.println(finder.apply("1234", "23"));
- 接收单个参数、返回结果用
Function;无参数有返回值用Supplier;接收单个参数无返回值用Consumer,这些接口都在java.util.function包下,直接导入即可使用。
这些内置接口覆盖了绝大多数常用的Lambda场景,无需再为每种参数/返回值组合自定义接口,比你之前的两种方法更简便灵活。
内容的提问来源于stack exchange,提问作者Vaishnav Kanhirathingal
相关产品推荐
相关产品推荐

