温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java语言JDK1.8新特性有哪些

发布时间:2021-11-24 15:49:51 来源:亿速云 阅读:399 作者:iii 栏目:大数据

本篇内容主要讲解“Java语言JDK1.8新特性有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java语言JDK1.8新特性有哪些”吧!

(1)Lambda表达式
    将函数当成参数传递给某个方法,或者把代码本身当作数据处理。
    
    List<String> list = Arrays.asList("c", "a", "b");
    list.sort((e1, e2)->e1.compareTo(e2));

(2)接口的默认方法、静态方法和函数式接口
    函数接口指的是只有一个函数的接口,这样的接口可以隐式转换为Lambda表达式。
    默认方法和静态方法不会破坏函数式接口的定义。

    @FunctionalInterface
    public interface IMyFunTest {
        void testFun();
        
        default String getZxwStr(){
            return "zxw";
        }
        
        static void printZxwStr(){
            System.out.println("zxw");
        }
    }

(3)方法引用
    方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁。

    public class Test {
        public static void main(String[] args) throws Exception {
            Test test = Test.create(Test::new);
            List<Test> list = Arrays.asList(test);
            list.forEach(Test::staticMethod);
            list.forEach(Test::noParamMethod);
            list.forEach(new Test()::instanceMethod);
        }
        //构造器引用,语法是Class::new
        public static Test create(Supplier<Test> supplier){
            return supplier.get();
        }
        //静态方法引用,语法是Class::static_method
        public static void staticMethod(Test test){
            System.out.println(test.toString());
        }
        //类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参
        public void noParamMethod(){
            System.out.println(this.toString());
        }
        //实例对象的成员方法的引用,语法是instance::method
        public void instanceMethod(Test test){
            System.out.println(test.toString());
            System.out.println(this.toString());
        }
    }

    // 普通应用场景
    List<String> list = Arrays.asList("a", "c", "b");
    list.sort(String::compareTo);
    list.forEach(System.out::println); //a b c

(4)重复注解
    不是语言层面的改进,而是编译器做的一个trick,底层的技术仍然相同。

    @Repeatable(Persons.class)
    public @interface Person{
        String role() default "";
    }
    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Persons {
        Person[] value();
    }
    @Person(role="father")
    @Person(role="son")
    public class Man {
        String name="";
    }
    
    public static void main(String[] args) throws Exception {
        for(Person t : Man.class.getAnnotationsByType(Person.class)){
            System.out.println(t.role());
        }
    }
(5)拓宽注解的应用场景
    注解几乎可以使用在任何元素上:局部变量、接口类型、超类和接口实现类,甚至可以用在函数的异常定义上。

(6)更好的类型推断
    List<String> list = new ArrayList<>();
    list.add("a");
    list.addAll(new ArrayList<>()); // JDK1.81之前编译不过

(7)Optional
    of:         把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
    empty:      创建一个空的Optional对象
    ofNullable: 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
    get:        如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
    orElse:     如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
    orElseGet:  如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
    orElseThrow:如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
    filter:     如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
    map:        如果创建的Optional中的值存在,对该值执行提供的Function函数调用
    flagMap:    如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,
                     否则就返回一个空的Optional对象
    isPresent:  如果创建的Optional中的值存在,返回true,否则返回false
    ifPresent:  如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做

(8)Streams
    将生成环境的函数式编程引入了Java库中。【相对复杂】

    List<String> list = new ArrayList<>();
    list.addAll(Arrays.asList("a", "b", "c"));
    list.stream().filter(e->!e.equals("b")).forEach(System.out::println);

    List<String> strList = Arrays.asList("a,b,cc,b,b,cc".split(","));
    Map<String, Long> sortMap = strList.stream().collect(Collectors.groupingBy(t -> t, Collectors.counting()));
    sortMap.forEach((key, value) -> System.out.println(key + "->" + value));

(9)Date/Time API
    新的时间和日期管理API深受Joda-Time影响,并吸收了很多Joda-Time的精华。
    java.util.time.*

(10)并行数组
    可以显著加快多核机器上的数组排序。

    long[] arrayOfLong = new long [ 20000 ];        
    Arrays.parallelSetAll( arrayOfLong, index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
    Arrays.stream( arrayOfLong ).limit(10).forEach( i -> System.out.print( i+" " ) );
    System.out.println();
    Arrays.parallelSort( arrayOfLong );        
    Arrays.stream( arrayOfLong ).limit(10).forEach( i -> System.out.print( i+" " ) );

(11)Base64编码支持
    java.util.Base64

(12)并发性
    java.util.concurrent 包下增加了很多新的类和方法。

(13)Nashorn JavaScript引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    System.out.println(engine.eval( "function f() { return 1; }; f() + 1;") ); // 2.0

(14)参数名称
    在语言层面(使用反射API和Parameter.getName())和字节码层面(使用新的 -parameters 参数)提供支持。

    Maven项目配置:
    <configuration>
            <compilerArgument>-parameters</compilerArgument>

到此,相信大家对“Java语言JDK1.8新特性有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI