美文网首页
Java8的新特性

Java8的新特性

作者: 丰极 | 来源:发表于2018-10-15 17:51 被阅读0次

    一、lambda表达式

    参考网址:http://www.importnew.com/16436.html

    @Test
        public void testlambda(){
    
            //线程
            new Thread(() -> System.out.println("Runnable\n")).start();
    
            //事件
            JButton show =  new JButton("Show");
            show.addActionListener((e) -> {
                System.out.println("Listener\n");
            });
    
            //集合
            List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
            features.forEach(n -> System.out.println(n));
    //        features.forEach(System.out::println);
    
            //mapReduce
            List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
            double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();
            System.out.println("Total : " + bill + "\n");
    
            Predicate<String> startsWithJ = (n) -> n.startsWith("J");
            Predicate<String> fourLetterLong = (n) -> n.length() == 4;
            List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
            names.stream()
                    .filter(startsWithJ.and(fourLetterLong))
                    .forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n + "\n"));
    
            //获取数字的个数、最小值、最大值、总和以及平均值
            List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
            IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
            System.out.println("Highest prime number in List : " + stats.getMax());
            System.out.println("Lowest prime number in List : " + stats.getMin());
            System.out.println("Sum of all prime numbers : " + stats.getSum());
            System.out.println("Average of all prime numbers : " + stats.getAverage());
    
        }
    

    二、Stream

    参考网址:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

    stream() : 返回串行流
    parallelStream() : 返回并行流

    @Test
    public void testStream() {
        List list = new ArrayList();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.parallelStream().forEach(e -> System.out.println(e));
    }
    

    三、接口默认方法

    public interface Vehicle {
       default void print(){
          System.out.println("我是一辆车!");
       }
    }
    

    四、新的Date-Time Api

    (1)

    import java.time.LocalDate;
    import java.time.LocalTime;
    import java.time.LocalDateTime;
    import java.time.Month;
     
    public class Java8Tester {
       public static void main(String args[]){
          Java8Tester java8tester = new Java8Tester();
          java8tester.testLocalDateTime();
       }
        
       public void testLocalDateTime(){
        
          // 获取当前的日期时间
          LocalDateTime currentTime = LocalDateTime.now();
          System.out.println("当前时间: " + currentTime);
            
          LocalDate date1 = currentTime.toLocalDate();
          System.out.println("date1: " + date1);
            
          Month month = currentTime.getMonth();
          int day = currentTime.getDayOfMonth();
          int seconds = currentTime.getSecond();
            
          System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);
            
          LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
          System.out.println("date2: " + date2);
            
          // 12 december 2014
          LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
          System.out.println("date3: " + date3);
            
          // 22 小时 15 分钟
          LocalTime date4 = LocalTime.of(22, 15);
          System.out.println("date4: " + date4);
            
          // 解析字符串
          LocalTime date5 = LocalTime.parse("20:15:30");
          System.out.println("date5: " + date5);
       }
    }
    

    (2)时区

    import java.time.ZonedDateTime;
    import java.time.ZoneId;
     
    public class Java8Tester {
       public static void main(String args[]){
          Java8Tester java8tester = new Java8Tester();
          java8tester.testZonedDateTime();
       }
        
       public void testZonedDateTime(){
        
          // 获取当前时间日期
          ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
          System.out.println("date1: " + date1);
            
          ZoneId id = ZoneId.of("Europe/Paris");
          System.out.println("ZoneId: " + id);
            
          ZoneId currentZone = ZoneId.systemDefault();
          System.out.println("当期时区: " + currentZone);
       }
    }
    

    五、 内置了 Base64 编码的编码器和解码器

    import java.util.Base64;
    import java.util.UUID;
    import java.io.UnsupportedEncodingException;
     
    public class Java8Tester {
       public static void main(String args[]){
          try {
            
             // 使用基本编码
             String base64encodedString = Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
             System.out.println("Base64 比那么字符串 (基本) :" + base64encodedString);
            
             // 解码
             byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
            
             System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));
             base64encodedString = Base64.getUrlEncoder().encodeToString("TutorialsPoint?java8".getBytes("utf-8"));
             System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
            
             StringBuilder stringBuilder = new StringBuilder();
            
             for (int i = 0; i < 10; ++i) {
                stringBuilder.append(UUID.randomUUID().toString());
             }
            
             byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
             String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
             System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
             
          }catch(UnsupportedEncodingException e){
             System.out.println("Error :" + e.getMessage());
          }
       }
    }
    

    六、方法引用

    方法引用使用一对冒号 ::

    package com.runoob.main;
     
    @FunctionalInterface
    public interface Supplier<T> {
        T get();
    }
     
    class Car {
        //Supplier是jdk1.8的接口,这里和lamda一起使用了
        public static Car create(final Supplier<Car> supplier) {
            return supplier.get();
        }
     
        public static void collide(final Car car) {
            System.out.println("Collided " + car.toString());
        }
     
        public void follow(final Car another) {
            System.out.println("Following the " + another.toString());
        }
     
        public void repair() {
            System.out.println("Repaired " + this.toString());
        }
    }
    

    (1)构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

    final Car car = Car.create( Car::new );
    final List< Car > cars = Arrays.asList( car );
    

    (2)静态方法引用:它的语法是Class::static_method,实例如下:

    cars.forEach( Car::collide );
    

    (3)特定类的任意对象的方法引用:它的语法是Class::method实例如下:

    cars.forEach( Car::repair );
    

    (4)特定对象的方法引用:它的语法是instance::method实例如下:

    final Car police = Car.create( Car::new );
    cars.forEach( police::follow );
    

    七、函数式接口

    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
     
    public class Java8Tester {
       public static void main(String args[]){
          List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
            
          // Predicate<Integer> predicate = n -> true
          // n 是一个参数传递到 Predicate 接口的 test 方法
          // n 如果存在则 test 方法返回 true
            
          System.out.println("输出所有数据:");
            
          // 传递参数 n
          eval(list, n->true);
            
          // Predicate<Integer> predicate1 = n -> n%2 == 0
          // n 是一个参数传递到 Predicate 接口的 test 方法
          // 如果 n%2 为 0 test 方法返回 true
            
          System.out.println("输出所有偶数:");
          eval(list, n-> n%2 == 0 );
            
          // Predicate<Integer> predicate2 = n -> n > 3
          // n 是一个参数传递到 Predicate 接口的 test 方法
          // 如果 n 大于 3 test 方法返回 true
            
          System.out.println("输出大于 3 的所有数字:");
          eval(list, n-> n > 3 );
       }
        
       public static void eval(List<Integer> list, Predicate<Integer> predicate) {
          for(Integer n: list) {
            
             if(predicate.test(n)) {
                System.out.println(n + " ");
             }
          }
       }
    }
    

    八、Optional 类

    Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
    Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
    Optional 类的引入很好的解决空指针异常。

    import java.util.Optional;
     
    public class Java8Tester {
       public static void main(String args[]){
       
          Java8Tester java8Tester = new Java8Tester();
          Integer value1 = null;
          Integer value2 = new Integer(10);
            
          // Optional.ofNullable - 允许传递为 null 参数
          Optional<Integer> a = Optional.ofNullable(value1);
            
          // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
          Optional<Integer> b = Optional.of(value2);
          System.out.println(java8Tester.sum(a,b));
       }
        
       public Integer sum(Optional<Integer> a, Optional<Integer> b){
        
          // Optional.isPresent - 判断值是否存在
            
          System.out.println("第一个参数值存在: " + a.isPresent());
          System.out.println("第二个参数值存在: " + b.isPresent());
            
          // Optional.orElse - 如果值存在,返回它,否则返回默认值
          Integer value1 = a.orElse(new Integer(0));
            
          //Optional.get - 获取值,值需要存在
          Integer value2 = b.get();
          return value1 + value2;
       }
    }
    

    相关文章

      网友评论

          本文标题:Java8的新特性

          本文链接:https://www.haomeiwen.com/subject/lhqqzftx.html