美文网首页
java8 lambda-3-目标类型

java8 lambda-3-目标类型

作者: 宠辱不惊的咸鱼 | 来源:发表于2019-10-01 09:21 被阅读0次
  • 对于给定的lambda表达式,它的类型是什么?
  • 答案是:它的类型是由其上下文推导而来。
ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());
    ActionListener
Callable<String> c = () -> "done";
    () -> "done"是Callable的实例
PrivilegedAction<String> a = () -> "done";
    () -> "done"是PrivilegedAction的实例
  • 编译器负责推导lambda表达式的类型,它利用lambda表达式所在上下文所期待的类型进行推导,这个被期待的类型被称为目标类型。
  • 当然,lambda表达式对目标类型也是有要求的,编译器会检查lambda表达式的类型和目标类型的方法签名(method signature)是否一致。当且仅当下面所有条件均满足时,lambda表达式才可以被赋给目标类型T:
    • T是一个函数式接口
    • lambda表达式的参数和T的方法参数在数量和类型上一一对应
    • lambda表达式的返回值和T的方法返回值相兼容(Compatible)
    • lambda表达式内所抛出的异常和T的方法throws类型相兼容
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
FileFilter java = f -> f.getName().endsWith(".java");
FileFilter java = (f) -> f.getName().endsWith(".java");
FileFilter java = (File f) -> f.getName().endsWith(".java");
button.addActionListener(e -> ui.dazzle(e.getModifiers()));

其他的上下文类型推导场景:泛型

List<String> ls = Collections.emptyList();
List<Integer> li = Collections.emptyList();
Map<String, Integer> m1 = new HashMap<>();
Map<Integer, String> m2 = new HashMap<>();

相关文章

网友评论

      本文标题:java8 lambda-3-目标类型

      本文链接:https://www.haomeiwen.com/subject/wnlkpctx.html