java 8新特性(一)

Java 8出来有很长一段时间了,由于之前一直在搞Ruby都没时间好好学习下,趁着有空整理一下

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

这里我们主要看编程语言相关的新特性:

Lambda表达式:

现在的匿名类有一个问题就是,当一个匿名类的实现非常简单,如一个接口只包含了唯一一个抽象方法,它的匿名类实现在解析的时候是笨重的且不清晰的。在这种情况下,我们通常会尝试将功能的实现当做另一个方法的参数传入,比如swing中当点击一个按钮,需要做的处理动作。Lambda表达式允许你这么做,将功能作为方法参数或者将代码作为数据。这个特性是属于函数式编程的特性,将一个代码块作为参数传入,如果学习过ruby的哈应该很好理解,与ruby的lambda表达式很类似。下面看一下官方给出的例子(由于例子太长,只展示重要部分,有兴趣可以自己去上面的地址看):

没有用Lambda表达式之前:

printPersons(
    roster,
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

用了之后:

printPersons(
    roster,
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25);

可以看出用了Lambda之后字需要给出方法实现的代码即可,简洁了不少,代码嵌套也少了两层,如果实现代码有多行时,需要在 ->后面使用{}同时最后必须有return,同时参数的类型也可以省略,Java编译器可以根据方法定义自动推导出参数类型。

接口的默认方法:

Java 8 允许在接口中定义非抽象的方法,需要用关键字default,叫做接口的默认方法或者扩展方法,这种方法可以定义多个。

具体代码如下:

public interface Parser {
    String getResult(String info);
    default String notKnow() {
        return "Sorry I do‘t know!";
    }
    default String anotherOne() {
        return "another one";
    }
}
public class AgeParser implements Parser {
  
    @Override
    public String getResult(String info) {
        if (info.matches("How old are you")) {
            return "I‘m 23";
        } else {
            return notKnow();
        }
    }

    public static void main(String[] args) {
        AgeParser parser = new AgeParser();
        System.out.println(parser.getResult("How old are you"));
        System.out.println(parser.getResult("You do‘t know"));
        System.out.println(parser.anotherOne());
    }
}

默认方法在接口的实现类中可以直接使用不需要重写,当然也是可以在实现类中重写这个方法的,同时,如果其他的接口继承了这个接口,那么默认方法也会被继承,同时可以在接口中重写默认方法。

函数式接口:

在上面Lambda表达式中,曾提出过一个接口只包含了唯一一个抽象方法(可以同时包含多个默认方法),这个接口被叫做函数式接口,也只有函数式接口才能使用Lambda表达式创建其对应的匿名内部类的实例,同时为了确保接口一定满足函数式接口的要求,可以在接口申明的上面加上@FunctionalInterface注解,如果不满足要求,如抽象方法多余一个,就会编译不过。

时间: 2024-10-15 05:37:45

java 8新特性(一)的相关文章

Java 5/Java 6/Java7/Java 8新特性收集

前言: Java 8对应的JDK版本为JDK8,而官网下载回来安装的时候,文件夹上写的是JDK1.8,同一个意思.(而这个版本命名也是有规律的,以此类推) 一.Java 5 1.https://segmentfault.com/a/1190000004417288 二.Java 6 2.https://segmentfault.com/a/1190000004417536 三.Java 7 1.http://www.eclipse.org/jdt/ui/r3_8/Java7news/whats-

Java 8新特性之旅:使用Stream API处理集合

在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda表达式增强方法”中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组创建流. 聚合流中的值. 1.

Java 8 新特性1-函数式接口

Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class Test2 { public static void main(String[] args) { for_test

Java 5/Java 6/Java7/Java 8新特性收集(转载)

Java 8对应的JDK版本为JDK8,而官网下载回来安装的时候,文件夹上写的是JDK1.8,同一个意思.(而这个版本命名也是有规律的,以此类推) 一.Java 5 1.https://segmentfault.com/a/1190000004417288 二.Java 6 2.https://segmentfault.com/a/1190000004417536 三.Java 7 1.http://www.eclipse.org/jdt/ui/r3_8/Java7news/whats-new-

Java 8新特性前瞻

快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年java 5发布以来的java世界中最大的事件了.它带来了java语言层面上的诸多改变,主要包括下面一些方面:语法.编译器.库.工具和运行时. 一,语法层面: 1,Lambda表达式. lambda表达式是一种可调用对象,它允许我们将函数作为函数参数传入.诸如C++.Groovy.Scala都已经支持la

Java 8新特性探究(八)精简的JRE详解

http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 Java 8新特性探究(八)精简的JRE详解 2015/02/05 | 分类: 基础技术 | 0 条评论 | 标签: JRE 分享到:2 原文出处: 成熟的毛毛虫的博客 Oracle公司如期发布了Java 8正式版!没有让广大javaer失望.对于

Java 8新特性-4 方法引用

对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMethodName 引用对象方法:  Object:: methodName 引用特定类型方法: ClassName :: methodName 引用构造方法: ClassName  :: new 静态方法引用示例 /** * 静态方法引用 * @param <P> 引用方法的参数类型 * @param

Java 8 新特性 – 终极手册整理

1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景. 本教程由下面几部分组成,它们分别涉及到Java平台某一特定方面的内容: 语言 编译器 类库 开发工具 运行时(Java虚拟机) 2.Java的新特性 总体来说,Java 8是一个大的版本升级.有人可能会说,Java 8的新特性非常令人

Spring 4支持的Java 8新特性一览

有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览Spring 4.0和4.1已经支持的Java 8新特性. Spring 4支持Java 6.7和8 Java 8编译器编译过的代码生成的.class文件需要在Java 8或以上的Java虚拟机上运行.由于Spring对反射机制和ASM.CGLIB等字节码操作函数库的重度使用,必须确保这些函数库能理解

【整理】Java 8新特性总结

闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS 版本,和过去的 Java 大版本升级不同,它们只有半年左右的开发和维护期.而未来的 Java11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本(得到 Oracle 等商业公司的长期支持服务).所以Java 8 就成了最新的一次LTS版本升级,这也是为什么Java开发者对J