您好,登录后才能下订单哦!
本篇内容主要讲解“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新特性有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。