Java 类型推断是 Java 8 中引入的一种新特性,它可以让程序员在不显式声明变量类型的情况下,让编译器自动推断出变量的类型。这样可以减少代码量,提高代码的可读性,使得代码更加优雅。
Java 类型推断主要有三个场景:Lambda 表达式、泛型方法、try-with-resources 语句。
// Lambda 表达式 Runnable r = () -> System.out.println("Hello World"); // 无需显式声明 Runnable 类型 // 泛型方法 List<String> list = Arrays.asList("a", "b", "c"); // 无需显式声明 List<String> 类型 // try-with-resources 语句 try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { // 无需显式声明 BufferedReader 类型 } catch (IOException e) { }
lambda表达式表示函数接口的实例。
根据上下文,一个lambda表达式可以映射到不同的函数接口类型。
编译器推断lambda表达式的类型。
在下面的代码中有两个函数接口, Processor
和SecondProcessor
。
Processor
有一个名为 getStringLength
的方法,它接受一个字符串作为参数,并返回 int
。
SecondProcessor
有一个名为 noName
的方法,它接受一个字符串作为参数,并返回一个 int
。
从代码中,我们可以看到,我们可以为它们分配两个相同的lambda表达式。
public class Main { public static void main(String[] argv) { Processor stringProcessor = (String str) -> str.length(); SecondProcessor secondProcessor = (String str) -> str.length(); //stringProcessor = secondProcessor; //compile error String name = "Java Lambda"; int length = stringProcessor.getStringLength(name); System.out.println(length); } } @FunctionalInterface interface Processor { int getStringLength(String str); } @FunctionalInterface interface SecondProcessor { int noName(String str); }
上面的代码生成以下结果。
Processor
或 SecondProcessor
称为目标类型。
推断lambda表达式类型的过程称为目标类型。
编译器使用以下规则来确定lambda表达式是否可分配给其目标类型:
Java IO教程 -Java管道管道连接输入流和输出流。管道 I/O基于生产者 - 消费者模式,其中生产者产生数据并且消费者消费数据。在管...
Java isLetter() 方法Java Character类isLetter() 方法用于判断指定字符是否为字母。语法boolean isLetter(char ch)参数ch -- 要...
Java数据类型教程 -Java多维数组我们可以在二维数组中存储表格数据。使用数组声明中每个维度的一对括号[]来声明多维数组。例如,...
Java数据类型教程 -Java short数据类型short数据类型是16位有符号Java原语整数数据类型。 其范围是-32768至32767(或-215 15 -1)...