zoukankan      html  css  js  c++  java
  • Java8新特性

    以下内容均来自菜鸟教程:http://www.runoob.com

     1 package com.buwei;
     2 
     3 /**
     4  * Lambda表达式,也成为闭包
     5  * Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)
     6  * 语法格式:
     7  *      (parameters) -> expression
     8  *      (parameters) -> {statements}
     9  * 重要特性:
    10  *      可选类型声明:不需要声明参数类型,编译器会用手一识别参数值
    11  *      可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号
    12  *      可选的大括号:如果主体包含了一个语句,就不需要使用大括号
    13  *      可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,
    14  *                     大括号需要指明表达式返回了一个数值
    15  * 注意点:
    16  *      Lambda表达式主要用来定义行内执行的方法类型接口
    17  *      Lambda表达式免去了使用匿名方法的麻烦,并且基于Java简单但是强大的函数化的编程能力
    18  * 变量作用域:
    19  *      Lambda表达式只能引用标记了final的外部局部变量
    20  *      就是说不能再Lambda内部修改定义在域外的局部变量,否则会编译错误
    21  * 可以直接在Lambda表达式中访问外层的局部变量
    22  * Lambda表达式的局部变量可以不用声明为final,但是必须不可被后面的代码修改
    23  * Lambda表达式中不允许声明一个局部变量同名的参数或者局部变量
    24  * @author buwei
    25  * @date 2018/12/8 19:16
    26  */
    27 public class LambdaDemo {
    28     static final String salutation = "HELLO";
    29     public static void main(String[] args) {
    30         LambdaDemo lambdaDemo = new LambdaDemo();
    31         // 需要声明类型
    32         MathOperation addition = (int a, int b) -> a + b;
    33         // 不用声明类型
    34         MathOperation subtraction = (a, b) -> a - b;
    35         // 大括号中的返回语句
    36         MathOperation multiplication = (int a, int b) -> {
    37             return a * b;
    38         };
    39         // 没有大括号及返回语句
    40         MathOperation division = (int a, int b) -> a / b;
    41         System.out.println("10 + 5 = " + lambdaDemo.operate(10, 5, addition));
    42         System.out.println("10 - 5 = " + lambdaDemo.operate(10, 5, subtraction));
    43         System.out.println("10 * 5 = " + lambdaDemo.operate(10, 5, multiplication));
    44         System.out.println("10 / 5 = " + lambdaDemo.operate(10, 5, division));
    45 
    46         // 不用括号
    47         GreetingService greetingService1 = message -> System.out.println("hello " + message);
    48         // 用括号
    49         GreetingService greetingService2 = (message) -> System.out.println("hello "+message);
    50 
    51         greetingService1.sayMessage("Google");
    52         greetingService2.sayMessage("baidu");
    53 
    54         // 引用外部的局部变量
    55         GreetingService greetingService3 = message -> System.out.println(salutation + message);
    56         greetingService3.sayMessage("cnblogs");
    57     }
    58 
    59     /**
    60      * 定义一个接口,在main方法中实现
    61      */
    62     public interface MathOperation {
    63         /**
    64          * 抽象方法
    65          * @param a 参数1
    66          * @param b 参数2
    67          * @return  返回值
    68          */
    69         int operation(int a, int b);
    70     }
    71 
    72     /**
    73      * 定义一个接口,在main方法中实现
    74      */
    75     public interface GreetingService {
    76         /**
    77          * 抽象方法
    78          * @param message 字符串
    79          */
    80         void sayMessage(String message);
    81     }
    82 
    83     /**
    84      * 定义私有方法,执行上面两个接口中的执行方法
    85      * @param a 参数1
    86      * @param b 参数2
    87      * @param mathOperation 抽象接口的实现类
    88      * @return 返回值
    89      */
    90     private int operate(int a, int b, MathOperation mathOperation) {
    91         return mathOperation.operation(a, b);
    92     }
    93 }
     1 package com.buwei;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 /**
     7  * 方法引用:通过方法的名字来指向一个方法
     8  *      使语言的构造更紧凑简洁,减少冗余代码
     9  *      方法引用使用一对冒号 ::
    10  * 四种引用方法:
    11  *      构造器引用:Class::new
    12  *      静态方法引用:Class::static_method
    13  *      特定类的任意对象的方法引用:Class::method
    14  *      特定对象的方法引用:instance::method
    15  * @author buwei
    16  * @date 2018/12/8 20:05
    17  */
    18 public class MethodReferencesDemo {
    19 
    20     public static void main(String[] args) {
    21         List<String> names = new ArrayList<String>();
    22 
    23         names.add("Google");
    24         names.add("Runoob");
    25         names.add("Taobao");
    26         names.add("Baidu");
    27         names.add("Sina");
    28 
    29         names.forEach(System.out::println);
    30 
    31     }
    32 }
     1 package com.buwei;
     2 
     3 /**
     4  * 函数式接口:就是有且仅有一个抽象方法,但是可以有多个费抽象方法
     5  * 函数式接口可以被隐式的转换为Lambda表达式
     6  * Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上
     7  * 下面写在一起只是为了更好的展现案例
     8  * @author buwei
     9  * @date 2018/12/8 20:16
    10  */
    11 public class FunctionalInterfaceDemo {
    12     /**
    13      * 定义一个函数式接口
    14      * @FunctionalInterface 注解主要是为了检测编译级错误
    15      * 函数式接口中允许定义静态方法:Java8中的新特性
    16      */
    17     @FunctionalInterface
    18     interface GreetingService {
    19         /**
    20          * 随便创建的一个抽象方法
    21          * @param message 随便创建的一个参数
    22          */
    23         void sayMessage(String message);
    24 
    25         /**
    26          * 随便定义一个静态方法做例子
    27          */
    28         static void printHello(){
    29             System.out.println("hello");
    30         }
    31     }
    32 
    33     public static void main(String[] args) {
    34         GreetingService greetingService = message -> System.out.println("hello" + message);
    35         greetingService.sayMessage("java");
    36     }
    37 
    38 }
     1 package com.buwei;
     2 
     3 
     4 /**
     5  * 默认方法:就是接口可以有实现方法,二期不需要实现类去实现其方法
     6  *          只需要在方法名前加上default关键字即可
     7  * 语法:
     8  *      public interface DefaultMethod{
     9  *           default void print(){
    10  *              sout(" 这是一个默认方法")
    11  *          }
    12  *      }
    13  *  优点:当需要修改接口是,需要修改全部实现该接口的类,
    14  *          解决办法是在接口中添加新的方法及实现
    15  *  静态默认方法:接口可以声明(并且可以提供实现)静态方法
    16  * @author buwei
    17  * @date 2018/12/8 20:29
    18  */
    19 public interface DefaultMethodDemo {
    20 
    21     default void testDefault(){
    22         System.out.println("这是一个接口中的默认方法");
    23     }
    24 
    25     static void testStatic(){
    26         System.out.println("这是一个接口中的静态方法");
    27     }
    28 }
     1 package com.buwei;
     2 
     3 import java.util.Optional;
     4 
     5 /**
     6  * Optional类是一个可以为null的容器对象
     7  *      如果值存在则isPresent()方法会返回true
     8  *      调用get()方法会返回该对象
     9  * Optional是个容器,他可以保存类型T的值
    10  *      或者仅仅保存null值。Optional提供很多有哦用的方法
    11  *      这样我们就不用显式进行空值检测
    12  * Optional类的引入很好的解决空指针异常
    13  * @author buwei
    14  * @date 2018/12/8 20:44
    15  */
    16 public class OptionalDemo {
    17 
    18     public static void main(String[] args) {
    19         OptionalDemo optionalDemo = new OptionalDemo();
    20         Integer a = null;
    21         Integer b = 0;
    22 
    23         // optional.ofNullable - 允许传递为null参数
    24         Optional<Integer> a1 = Optional.ofNullable(a);
    25 
    26         // optional.of - 如果传递的参数是null,抛出异常NullPointerException
    27         Optional<Integer> b1 = Optional.of(b);
    28         System.out.println(optionalDemo.sun(a1, b1));
    29 
    30     }
    31 
    32     private Integer sun(Optional<Integer> a, Optional<Integer> b){
    33         // Optional.isPresent() - 判断值是否存在
    34         System.out.println("第一个参数值是否存在:"+a.isPresent());
    35         System.out.println("第二个参数值是否存在:"+b.isPresent());
    36 
    37         // Optional.orElse() - 如果值存在,返回它,否则返回默认值
    38         Integer a2 = a.orElse(0);
    39         System.out.println(a2);
    40 
    41         // Optional.get() - 获取值,值需要存在
    42         Integer b2 = b.get();
    43         return a2 + b2;
    44     }
    45 }
     1 package com.buwei;
     2 
     3 import java.time.LocalDate;
     4 import java.time.LocalDateTime;
     5 import java.time.LocalTime;
     6 import java.time.Month;
     7 
     8 /**
     9  * Date-Time API来加强对日期与时间的处理
    10  *      Java.util.Date:
    11  *          非线程安全的
    12  *          与java.sql.Date混乱
    13  *              util包下的同时包含日期和时间
    14  *              sql包下的仅包含日期
    15  *          时区处理麻烦:没有时区支持
    16  * Java8在Java.time包下提供了很多新的API,以下为两个比较重要的API:
    17  *      Local(本地) - 简化了时间的处理,没有时区的问题
    18  *      Zoned(时区) - 通过制定的时区处理日期时间
    19  * @author buwei
    20  * @date 2018/12/8 20:59
    21  */
    22 public class NewDate {
    23 
    24     public static void main(String[] args) {
    25         NewDate newDate = new NewDate();
    26         newDate.testLocalDateTime();
    27 
    28     }
    29 
    30     public void  testLocalDateTime(){
    31         // 获取当前时间日期
    32         LocalDateTime currentTime = LocalDateTime.now();
    33         System.out.println("当前时间:" + currentTime);
    34 
    35         LocalDate date1 = currentTime.toLocalDate();
    36         System.out.println("date1:" + date1);
    37 
    38         Month month = currentTime.getMonth();
    39         int day = currentTime.getDayOfMonth();
    40         int second = currentTime.getSecond();
    41 
    42         System.out.println(month + "月:" + day + ",日:" + second + ",秒");
    43 
    44         LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
    45         System.out.println("date2" + date2);
    46 
    47         // 12 december 2014
    48         LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
    49         System.out.println("date3: " + date3);
    50 
    51         // 22 小时 15 分钟
    52         LocalTime date4 = LocalTime.of(22, 15);
    53         System.out.println("date4: " + date4);
    54 
    55         // 解析字符串
    56         LocalTime date5 = LocalTime.parse("20:15:30");
    57         System.out.println("date5: " + date5);
    58     }
    59 }
    • 只贴出了自己有些理解的部分,后续再补充。。。。
    如发现有错误欢迎指正,欢迎交流,接受反驳。 -- by不为 :)
  • 相关阅读:
    骚猪队的模板
    cs231n 作业2 心路历程
    cs231n 作业1 心路历程
    视觉语言导航综述Visual Language Navigation
    论文阅读DSAE,不知道VAE能不能玩的下去
    icpc 2019 word final A题 思路
    VAE 变分自动编码器入门
    luogu4827 梦美的线段树
    EOJ Monthly 2019.2 存代码
    国王游戏,高精度完全模板
  • 原文地址:https://www.cnblogs.com/buwei/p/10089143.html
Copyright © 2011-2022 走看看