不使用lambda表达式能否定义Java中的Function或BiFunction实例
完全可以不用lambda表达式创建Function、BiFunction实例。这两个都是Java自带的函数式接口,lambda本质只是简化接口实现的语法糖,你用传统的匿名内部类写法就能实现,只要学生学过接口和匿名内部类的概念就能理解。
你之前代码报错的原因
你混淆了泛型参数声明和方法参数的写法:BiFunction的三个泛型参数仅需要指定「第一个入参类型、第二个入参类型、返回值类型」,不需要在泛型尖括号里写变量名s、c;同时你不能直接把方法体写在变量声明后,需要实现接口的唯一抽象方法apply。
正确的匿名内部类实现写法
// 实现Function的例子 private static Function<Integer, Boolean> IsEvenFunc = new Function<Integer, Boolean>() { @Override public Boolean apply(Integer i) { return i % 2 == 0; } }; // 实现BiFunction的例子 private static BiFunction<String, Character, Boolean> ByFirstCharFunc = new BiFunction<String, Character, Boolean>() { @Override public Boolean apply(String s, Character c) { return s.charAt(0) == c.charValue(); } };
以上写法和你原来用lambda的写法功能完全一致,后续的调用逻辑不需要做任何修改,原有代码可以直接正常运行。
如果你的学生已经掌握了静态方法和方法引用的概念,也可以用更简洁的写法:
// 先写普通静态方法 private static boolean isEven(Integer i) { return i % 2 == 0; } private static boolean checkFirstChar(String s, Character c) { return s.charAt(0) == c.charValue(); } // 用方法引用赋值给接口变量,把下面的「你的类名」替换成实际的类名即可 private static Function<Integer, Boolean> IsEvenFunc = 你的类名::isEven; private static BiFunction<String, Character, Boolean> ByFirstCharFunc = 你的类名::checkFirstChar;
内容的提问来源于stack exchange,提问作者delrocco
相关产品推荐
相关产品推荐

