2.中间的是 -> ,用来分割参数和body部分
3.是body部分,可以是一个表达式或者一个语句块。如果是一个表达式,表达式的值会被作为返回值返回;如果是语句块,需要用return语句指定返回值。如下面这个lambda表达式接受一个整形的参数a,返回a的平方
Java代码- (int a) -> a^2
等同于
Java代码- (int a) -> {return a^2;}
继续看更多的例子:
Java代码- (int x, int y) -> x + y
- () -> 42
- (String s) -> { System.out.println(s); }
创建一个FileFilter,文件过滤器:
Java代码- FileFilter java = (File f) -> f.getName().endsWith(".java")
创建一个线程:
Java代码- new Thread(() -> {
- //do sth here...
- }).start()
创建一个Callable:
Java代码- Callable
c = () -> "done"; 创建一个String的比较器:
Java代码- Comparator
c = (s1, s2) -> s1.compareToIgnoreCase(s2); 而且lambda表达式可以赋值给一个变量:
Java代码- Comparator
c; - c = (String s1, String s2) -> s1.compareToIgnoreCase(s2);
还可以作为方法的返回值:
Java代码- public Runnable toDoLater() {
- return () -> {
- System.out.println("later");
- };
- }
从上面可以看到,一个lambda表达式被作为一个接口类型对待,具体对应哪个接口,编译器会根据上下文环境推断出来,如下面的lambda表达式就表示一个ActionListener.
Java代码- ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());
这有可能会造成一个表达式在不同的上下文中被作为不同的类型,如下面的这种情况,尽管两个表达式是相同的,上面的表达式被推断为Callable的类型,下面的会被推断为PrivilegedAction类型。
Java代码- Callable
c = () -> "done"; - PrivilegedAction
a = () -> "done"; 那么编译器是根据哪些因为决定一个表达式的类型呢?
如果一个表达式被推断为是T类型的,需要满足以下4个条件:
1.T是函数式接口类型(只声明唯一一个方法)
2.表达式和T中声明的方法的参数个数一致,参数类型也一致
3.表达式和T中声明的方法的返回值类型一致
4.表达式和T中声明的方法抛出的异常一致
有了这个准则,上面的疑问就迎刃而解了
函数式接口。函数式接口是只定义了一个抽象方法的接口。Java 8引入了FunctionalInterface注解来表明一个接口打算成为一个函数式接口。例如,java.lang.Runnable就是一个函数式接口。
Lambda。函数式接口的重要属性是:我们能够使用lambda实例化它们,Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待。
方法引用。方法引用是简洁的Lambda表达式,能够用于已经拥有名称的方法。下面是一些方法引用的例子,右边是同样效果的Lambda表达式。
java.util.stream。新的 java.util.stream包提供了对值流进行函数式操作的类。
改进了泛型推断。这提升了Java编译器推断泛型和在泛型方法调用中减少显式类型参数的能力。
java.time。新的日期/时间API包含在 java.time包中。所有的类都是不可变且线程安全的。日期和时间类型包括Instant、LocalDate、LocalTime、LocalDateTime和ZonedDateTime。除了日期和时间之外,还有Duration和Period类型。另外,值类型包括Month、DayOfWeek、Year、 Month、YearMonth、MonthDay、OffsetTime和OffsetDateTime。这些新的日期/时间类大部分JDBC都支持。
当然,以上只是一小部分新特性,关于Java 8的相关信息,请点此查看。
Jigsaw项目被推迟到Java SE 9
“对于Java开发者来说,Java 8意味着一次重大的转变。”JFrog公司CTO Yoav Landman表示,“JDK 8加入了Lambda表达式以及方法引用,这会让程序变得更加简单。”
IDC分析师Al Hilwa也表示,加入Lambda是Java的一次重要变化,这对于并行编程来说将非常有益。“虽然给编程语言带来了很大的影响,但Lambda仅仅是增加并行化编程能力的一部分。”
JDK 8原定于去年9月发布,但由于安全问题,Oracle推迟到了今年3月份。此外,原本计划加入的Project Jigsaw,也推迟到了Java SE 9上,这让很多Java开发者失望不已。
此外, 国外媒体也针对JDK 8进行了一项调查,主要面向Java中间件厂商。调查结果显示,有29%的公司计划六个月内升级到最新版本;有25%公司会在十二个月内完成升级;有32%的公司还未对新版本进行评估;同时,也有22%的企业还在使用在2006年发布的Java SE 6。
- Callable
- ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());
- Comparator
- Comparator
- Callable
- FileFilter java = (File f) -> f.getName().endsWith(".java")
- (int a) -> {return a^2;}