1.Lambda表达式

Lambda表达式时特殊的匿名内部类,语法更简洁。它允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。

 1 package com.example.jdk8;
 2 
 3 import java.util.Comparator;
 4 import java.util.TreeSet;
 5 
 6 public class demo01 {
 7     // Lambda表达式
 8     public static void main(String[] args) {
 9         // 1.线程
10         Runnable runnable = new Runnable() {
11 
12             @Override
13             public void run() {
14                 System.out.println("使用匿名内部类");
15             }
16         };
17         new Thread(runnable).start();
18 
19         Runnable runnable1 = () -> System.out.println("使用Lambda表达式");
20         new Thread(runnable1).start();
21 
22         // 2.比较器
23         Comparator<String> com = new Comparator<String>() {
24 
25             @Override
26             public int compare(String o1, String o2) {
27                 return o1.length() - o2.length();
28             }
29         };
30 
31         TreeSet<String> treeSet = new TreeSet<>(com);
32 
33         TreeSet<String> treeSet2 = new TreeSet<String>((o1, o2) -> o1.length() - o2.length());
34     }
35 }

 

2.函数式接口

如果一个接口只有一个抽象方法,则该接口称为函数式接口,只有函数式接口可以使用Lambda表达式。

 1 package com.example.jdk8;
 2 
 3 import java.util.Comparator;
 4 import java.util.TreeSet;
 5 import java.util.function.Consumer;
 6 import java.util.function.Function;
 7 import java.util.function.Predicate;
 8 import java.util.function.Supplier;
 9 
10 public class demo02 {
11 
12     public static void main(String[] args) {
13         Usb mouse = new Usb() {
14 
15             @Override
16             public void service() {
17                 // TODO Auto-generated method stub
18                 System.out.println("默认实现接口");
19             }
20         };
21         mouse.service();
22 
23         Usb fan = () -> System.out.println("Lambda表达式实现接口");
24         fan.service();
25 
26         // 常见函数式接口
27 
28         // 1.消费型,参数T,返回值void
29         Consumer<Integer> consumer = (i) -> System.out.println("Lambda表达式实现接口");
30 
31         // 2.供给型,参数无,返回T
32         Supplier<Integer> supplier = () -> {
33             return Integer.valueOf(100);
34         };
35 
36         // 3.函数型,参数T,返回值R
37         Function<Integer, String> function = (i) -> {
38             return i.toString();
39         };
40 
41         // 4.断言,输入T,返回boolean
42         Predicate<Integer> predicate = (i) -> i > 10;
43     }
44 }

 

3.方法引用

对象::实例方法

类::静态方法

类::实例方法

类::new

 1 package com.example.jdk8;
 2 
 3 import java.util.Comparator;
 4 import java.util.function.Consumer;
 5 import java.util.function.Function;
 6 import java.util.function.Supplier;
 7 
 8 public class demo03 {
 9     public static void main(String[] args) {
10         // 1.对象::实例方法
11         Consumer<String> consumer = s -> System.out.println(s);
12         consumer.accept("hello");
13 
14         // println()是一个输入参数,无返回值的方法
15         // consumer2是一个输入参数,无返回值的方法
16         // 这两个方法的形式一致,就可以使用"方法引用"的简写形式
17         Consumer<String> consumer2 = System.out::println;
18         consumer2.accept("world");
19 
20         // 2.类::静态方法
21         Comparator<Integer> com = (o1, o2) -> Integer.compare(o1, o2);
22         Comparator<Integer> com2 = Integer::compare;
23 
24         // 3.类::实例方法
25         Function<Employee, String> function = e -> e.getName();
26         Function<Employee, String> function2 = Employee::getName;
27 
28         // 4.类::new
29         Supplier<Employee> supplier = () -> new Employee();
30         Supplier<Employee> supplier2 = Employee::new;
31     }
32 }

 

4.Stream流

流中保存对集合或数组数据的操作。

(1)Stream自己不会存储元素。

(2)Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream。

(3)Stream操作时延迟执行的。

使用步骤:创建,中间操作,终止操作。

4.1创建

 1 package com.example.jdk8;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5 import java.util.Random;
 6 import java.util.stream.IntStream;
 7 import java.util.stream.Stream;
 8 
 9 public class demo04 {
10 
11     public static void main(String[] args) {
12         // 创建Stream
13         // (1)Collection对象中的stream(方法)和parallelStream()方法创建流
14         ArrayList<String> arrayList = new ArrayList<>();
15         arrayList.add("1");
16         arrayList.add("2");
17         arrayList.add("3");
18 
19         // 串行流
20         Stream stream = arrayList.stream();
21         stream.forEach(s -> System.out.println(s));
22 
23         // 并行流,使用多线程,打印顺序可能不固定
24         Stream stream1 = arrayList.parallelStream();
25         stream1.forEach(System.out::println);
26 
27         // (2)Array工具类的stram()方法
28         String[] arr = { "aaa", "bbb", "ccc" };
29         Stream<String> stream2 = Arrays.stream(arr);
30         stream2.forEach(System.out::println);
31 
32         // (3)stream接口中的of方法 iterate、generate
33         Stream<Integer> stream3 = Stream.of(10, 20, 30);
34         stream3.forEach(System.out::println);
35 
36         // 迭代流
37         System.out.println("--------迭代流-----------");
38         Stream<Integer> iterate = Stream.iterate(0, x -> x + 2);
39         iterate.limit(10).forEach(System.out::println);
40         System.out.println("--------生成流-----------");
41         Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100));
42         generate.limit(10).forEach(System.out::println);
43 
44         // (4)IntStream,LongStream,DoubleStream的of,range,rangeClosed
45         IntStream stream4 = IntStream.of(100, 200, 300);
46         stream4.forEach(System.out::println);
47     }
48 }

 

4.2中间操作

 1 package com.example.jdk8;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class demo05 {
 6     public static void main(String[] args) {
 7         ArrayList<Employee> list = new ArrayList<>();
 8         list.add(new Employee("1", 1));
 9         list.add(new Employee("2", 2));
10         list.add(new Employee("3", 3));
11         list.add(new Employee("4", 4));
12         list.add(new Employee("5", 5));
13         list.add(new Employee("4", 4));
14         // 中间操作:
15         // 1 filter过滤
16         System.out.println("-----------filter--------------");
17         list.stream().filter(e -> e.getAmount() > 3).forEach(System.out::println);
18 
19         // 2 limit限制
20         System.out.println("-----------limit--------------");
21         list.stream().limit(2).forEach(System.out::println);
22 
23         // 3 skip跳过
24         System.out.println("-----------skip--------------");
25         list.stream().skip(2).forEach(System.out::println);
26 
27         // 4 distinct去重
28         // 需要override hashcode()和equals()
29         System.out.println("-----------distinct--------------");
30         list.stream().distinct().forEach(System.out::println);
31 
32         // 5 sorted排序
33         System.out.println("-----------sorted--------------");
34         list.stream().sorted((o1, o2) -> Integer.compare(o1.getAmount(), o2.getAmount())).forEach(System.out::println);
35 
36         // 中间操作2 map
37         System.out.println("-----------map--------------");
38         list.stream().map(e -> e.getName()).forEach(System.out::println);
39 
40         // 中间操作3 parallel 采用多线程
41         System.out.println("-----------parallel--------------");
42         list.parallelStream().forEach(System.out::println);
43     }
44 }

 

4.3终止操作

forEach、min、max、count、reduce、collect

 1 package com.example.jdk8;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Optional;
 6 import java.util.stream.Collectors;
 7 
 8 public class demo06 {
 9 
10     public static void main(String[] args) {
11         ArrayList<Employee> list = new ArrayList<>();
12         list.add(new Employee("1", 1));
13         list.add(new Employee("2", 2));
14         list.add(new Employee("3", 3));
15         list.add(new Employee("4", 4));
16         list.add(new Employee("5", 5));
17 
18         // forEach 终止操作
19         System.out.println("--------------forEach--------------");
20         list.stream().filter(e -> e.getAmount() > 2).forEach(System.out::println);
21 
22         // min/max/count 终止操作
23         System.out.println("--------------min--------------");
24         Optional<Employee> min = list.stream().min((e1, e2) -> Integer.compare(e1.getAmount(), e2.getAmount()));
25         System.out.println(min.get());
26 
27         // reduce 终止操作
28         System.out.println("--------------reduce--------------");
29         Optional<Integer> sum = list.stream().map(e -> e.getAmount()).reduce((x, y) -> x + y);
30         System.out.println(sum.get());
31 
32         // collect 终止操作
33         System.out.println("--------------collect--------------");
34         List<String> lists = list.stream().map(e -> e.getName()).collect(Collectors.toList());
35         for (String s : lists) {
36             System.out.println(s);
37         }
38     }
39 }

 

5.新日期时间API

SimpleDateFormat类是线程不安全的,DateTimeFormatter类是JDK1.8新增的,线程安全。

 1 package com.example.jdk8;
 2 
 3 import java.time.Duration;
 4 import java.time.Instant;
 5 import java.time.LocalDateTime;
 6 import java.time.ZoneId;
 7 import java.time.format.DateTimeFormatter;
 8 import java.util.Date;
 9 import java.util.Set;
10 
11 import org.springframework.format.annotation.DateTimeFormat;
12 
13 public class demo07 {
14     public static void main(String[] args) {
15         // LocalDate LocalTime LocalDateTime
16         // 创建日期时间
17         LocalDateTime ldt = LocalDateTime.now();
18         LocalDateTime ldt2 = LocalDateTime.of(2021, 2, 1, 15, 54);
19 
20         System.out.println(ldt);
21         System.out.println(ldt2.getMonth());
22 
23         // 2增加/减少时间
24         LocalDateTime plusDays = ldt2.plusDays(2);
25         System.out.println(plusDays);
26 
27         // Instant 时间戳
28         Instant instant = Instant.now();
29         // Instant.ofEpochMilli(1612166319268L);
30 
31         System.out.println(instant);
32         System.out.println(instant.toEpochMilli());
33 
34         Instant instant2 = instant.plusSeconds(10);
35         System.out.println(Duration.between(instant, instant2).toMillis());
36 
37         // ZoneId时区
38         Set<String> sets = ZoneId.getAvailableZoneIds();
39         for (String s : sets) {
40             System.out.println(s);
41         }
42         System.out.println("当前时区");
43         System.out.println(ZoneId.systemDefault());// Asia/Shanghai
44 
45         // Date Instant LocalDateTime 几种日期类型转换
46         // Date -> Instant -> LocalDateTime
47         Date date = new Date();
48         Instant inst = date.toInstant();
49         LocalDateTime ldt3 = LocalDateTime.ofInstant(inst, ZoneId.systemDefault());
50         System.out.println(ldt3);
51 
52         // LocalDateTime -> Instant -> Date
53         Instant inst2 = ldt3.atZone(ZoneId.systemDefault()).toInstant();
54         Date from = date.from(inst2);
55         System.out.println(from);
56 
57         // DateTimeFormat
58         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
59         // 时间格式化成字符串
60         System.out.println(dtf.format(LocalDateTime.now()));
61 
62         // 字符串转换为时间
63         LocalDateTime ldt4 = LocalDateTime.parse("2021-02-01 16:10:02", dtf);
64         System.out.println(ldt4);
65     }
66 }

 

posted on 2021-02-01 16:11  Sempron2800+  阅读(83)  评论(0编辑  收藏  举报