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不为 :)
  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/buwei/p/10089143.html
Copyright © 2011-2022 走看看