网上搜集的有关于java8的新特性(二)

2014-11-24 00:35:19 · 作者: · 浏览: 1
参数,这里无参数,就是一对空括号

2.中间的是 -> ,用来分割参数和body部分

3.是body部分,可以是一个表达式或者一个语句块。如果是一个表达式,表达式的值会被作为返回值返回;如果是语句块,需要用return语句指定返回值。如下面这个lambda表达式接受一个整形的参数a,返回a的平方

Java代码
  1. (int a) -> a^2

    等同于

    Java代码
    1. (int a) -> {return a^2;}

      继续看更多的例子:

      Java代码
      1. (int x, int y) -> x + y
      2. () -> 42
      3. (String s) -> { System.out.println(s); }

        创建一个FileFilter,文件过滤器:

        Java代码
        1. FileFilter java = (File f) -> f.getName().endsWith(".java")

          创建一个线程:

          Java代码
          1. new Thread(() -> {
          2. //do sth here...
          3. }).start()

            创建一个Callable:

            Java代码
            1. Callable c = () -> "done";

              创建一个String的比较器:

              Java代码
              1. Comparator c = (s1, s2) -> s1.compareToIgnoreCase(s2);

                而且lambda表达式可以赋值给一个变量:

                Java代码
                1. Comparator c;
                2. c = (String s1, String s2) -> s1.compareToIgnoreCase(s2);

                  还可以作为方法的返回值:

                  Java代码
                  1. public Runnable toDoLater() {
                  2. return () -> {
                  3. System.out.println("later");
                  4. };
                  5. }

                    从上面可以看到,一个lambda表达式被作为一个接口类型对待,具体对应哪个接口,编译器会根据上下文环境推断出来,如下面的lambda表达式就表示一个ActionListener.

                    Java代码
                    1. ActionListener l = (ActionEvent e) -> ui.dazzle(e.getModifiers());

                      这有可能会造成一个表达式在不同的上下文中被作为不同的类型,如下面的这种情况,尽管两个表达式是相同的,上面的表达式被推断为Callable的类型,下面的会被推断为PrivilegedAction类型。

                      Java代码
                      1. Callable c = () -> "done";
                      2. 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。