以下内容均来自菜鸟教程: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 }