当前位置:   article > 正文

JAVA从入门到精通------基础篇------java8新特性_java version8

java version8

1、Java8概述

java8(又称JDK 1.8) 是Java语言开发的一个主要版本

Oracle公司于2014年3月18日发布Java8

        支持Lambda表达式

        函数式接口

新的Stream API

        新的StreamAPI

        新的日期 API

        其他特性


2、Lambda表达式

Lambda表达式:特殊的匿名内部类,语法更简洁

Lmbda表达式允许把函数作为一个方法的参数(函数作为方法参数传递), 将代码像数据一样传递

基本语法:

<函数式接口> <变量名> = (参数1, 参数2...) -> {

//方法体

}

Lambda引入了新的操作符:->(箭头操作符), ->将表达式分成两部分

左侧:(参数1, 参数2...)表达参数列表

右侧:{}内部是方法体

注意事项:

        形参列表的数据类型会自动判断

        如果形参列表为空, 只需保留()

        如果形参只有1个,()可以省略,只需要参数的名称即可。

        如果形参只有1个,()可以省略,若有返回值,则若想去省{},则必须同时省略return,且执行         语句也保证只有一句

        Lambda不会生成一个单独的内部类文件

 没有参数

  1. package com.qf.webpro2105.test;
  2. public class Test1 {
  3. public static void main(String[] args) {
  4. Runnable runnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. System.out.println("执行的是lambda之前的方法");
  8. }
  9. };
  10. Thread thread1 = new Thread(runnable);
  11. thread1.start();
  12. Runnable runnable1 = () -> {
  13. System.out.println("执行的是lambda的方法");
  14. };
  15. Thread thread2 = new Thread(runnable1);
  16. thread2.start();
  17. Thread thread3 = new Thread(() -> {System.out.println("执行的是Thread中的方法");});
  18. thread3.start();
  19. }
  20. }

 

有参数

  1. package com.qf.webpro2105.test;
  2. import java.util.*;
  3. public class Test2 {
  4. public static void main(String[] args) {
  5. Student student1 = new Student("张三",30);
  6. Student student2 = new Student("李四",80);
  7. Student student3 = new Student("王五",15);
  8. List<Student> list = new ArrayList<Student>();
  9. list.add(student1);
  10. list.add(student2);
  11. list.add(student3);
  12. Comparator<Student> comparator = new Comparator<Student>() {
  13. @Override
  14. public int compare(Student o1, Student o2) {
  15. return o1.getAge()-o2.getAge();
  16. }
  17. };
  18. Collections.sort(list,comparator);
  19. for (Student stu:list) {
  20. System.out.println(stu);
  21. }
  22. Comparator<Student> comparator1 = (Student o1, Student o2 )->{
  23. return o2.getAge()- o1.getAge();
  24. };
  25. Collections.sort(list,comparator1);
  26. for (Student stu1:list){
  27. System.out.println(stu1);
  28. }
  29. }
  30. }

自己定义的抽象方法

  1. package com.qf.webpro2105.test;
  2. public class Test3 {
  3. public static void main(String[] args) {
  4. Play play = new Play() {
  5. @Override
  6. public void platBall(String name, String where) {
  7. System.out.println(name + "去了" + where);
  8. }
  9. };
  10. play.platBall("张三","北京");
  11. //play是类名,参数是类中唯一一个抽象方法中的参数
  12. Play play1 = (String name, String where) ->{
  13. System.out.println(name + "去了" + where);
  14. };
  15. play1.platBall("张三", "上海");
  16. }
  17. }

数据类型可以省略

如果形参只有1个,()可以省略,只需要参数的名称即可。

如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有一句。

  1. package com.qf.webpro2105.test;
  2. public class Test3 {
  3. public static void main(String[] args) {
  4. //当抽象方法有返回值的时候 这里省略return
  5. Play play1 = name -> "我叫" + name;
  6. //如果想加上return 一定也要加上 {}
  7. Play play2 = name -> {return "我叫" + name;};
  8. String m =play1.platBall("张三");
  9. System.out.println(m);
  10. }
  11. }

     

 最后一个分号也可以省略

Play play1 = name ->System.out.println(name);

【说明】@FunctionalInterface注解检测接口是否符合函数式接口。


3、函数式接口

        如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda         表达式,Lambda表达式会被匹配到这个抽象方法上,只能是自身有一个抽象方法,如果是从         父类中继承下来的方法不算

【说明】如果方法中有一个自身的抽象方法,有一个从父类中继承下来的抽象方法,那么也算是函数式接口,因为它本身的抽象方法只有一个        


  

4、常见函数式接口

消费型接口  Consumer

  1. package com.qf.webpro2105.test;
  2. import java.util.function.Consumer;
  3. public class Test4 {
  4. public static void main(String[] args) {
  5. //消费型函数式接口:接口中有一个方法:1个参数、类型指定,无返回值
  6. //使用accept来进行输出
  7. Consumer<Integer> consumer = t -> {
  8. if (t > 18) {
  9. System.out.println("年龄大于18");
  10. }else {
  11. System.out.println("年龄小于等于18");
  12. }
  13. };
  14. consumer.accept(20);
  15. }
  16. }

供给型接口 Supplier<T>

  1. package com.qf.javasepro2105.day25;
  2. import java.util.Random;
  3. import java.util.function.Supplier;
  4. public class SupplierDemo {
  5. public static void main(String[] args){
  6. //供给型函数式接口
  7. //抽象方法get() 无参数 有返回值 return
  8. Supplier<Integer> supplier=()->new Random().nextInt(30-20+1)+20;
  9. int[] ary=new int[5];
  10. setAry(ary,supplier);
  11. //遍历数组里的值
  12. for(int i:ary){
  13. System.out.println(i);
  14. }
  15. }
  16. public static void setAry(int[] ary,Supplier<Integer> sup){
  17. for(int i=0; i<ary.length; i++){
  18. ary[i]=sup.get();
  19. }
  20. }
  21. }

函数型接口Function<T,R>

  1. package com.qf.webpro2105.test;
  2. import java.util.function.Function;
  3. public class Test6 {
  4. public static void main(String[] args) {
  5. //函数型接口
  6. //抽象方法apply 参数t 返回值是r
  7. //功能:对参数t进行处理,返回处理的结果r
  8. // 参数类型 -> String 返回值类型 -> String
  9. Function<String, String> fun=t->"北京:"+t.toLowerCase();
  10. String result=fun.apply("张三");
  11. System.out.println(result);
  12. }
  13. }

断言型接口 Predicate<T>

  1. package com.qf.webpro2105.test;
  2. import java.util.function.Predicate;
  3. public class Test8 {
  4. public static void main(String[] args) {
  5. //断言型接口
  6. //抽象方法test(T t) 返回值boolean
  7. Predicate<JobCondition> pre = t -> {
  8. if (t.getScore() >= 60 && t.getCheckResult().equals("良好")) {
  9. return true;
  10. } else {
  11. return false;
  12. }
  13. };
  14. JobCondition jiaoCondition = new JobCondition(99, "良好");
  15. boolean result = pre.test(jiaoCondition);
  16. System.out.println("你能够入职?" + result);
  17. }
  18. }


5、方法引用

方法引用是Lambda表达式的一种简写形式。如果Lambda表达式方法体中只是掉用一个特定的已经存在的方法,则可以使用方法引用。

  1. package com.qf.webpro2105.test;
  2. import java.util.function.Consumer;
  3. public class Test9 {
  4. public static void main(String[] args) {
  5. //单纯使用lambda表达式
  6. Consumer<String> con1 = t -> System.out.println(t);
  7. con1.accept("大家好,我是张三");
  8. //使用方法引用
  9. Consumer<String> con2 = System.out::println;
  10. con2.accept("大家好,我是李四");
  11. }
  12. }

常见形式

        对象::实例方法

        类::静态方法

        类::实例方法

        类::new

  1. //1 对象::实例方法
  2. Consumer<String> consumer=s->System.out.println(s);
  3. consumer.accept("hello");
  4. Consumer<String> consumer2=System.out::println;
  5. consumer.accept("world");
  6. //2类::静态方法
  7. Comparator<Integer> com=(o1,o2)->Integer.compare(o1, o2);
  8. Comparator<Integer> com2=Integer::compare;
  9. //3类::实例方法
  10. Function<Employee, String> function=e->e.getName();
  11. Function<Employee, String> function2=Employee::getName;
  12. System.out.println(function2.apply(new Employee("小明", 50000)));
  13. //4类::new
  14. Supplier<Employee> supplier=()->new Employee();
  15. Supplier<Employee> supplier2=Employee::new;
  16. Employee employee=supplier.get();
  17. System.out.println(employee.toString());


6、Stream

流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作


7、Stream特点

        Stream自己不会存储元素

        Stresam不会改变源对象。相反,他们会返回一个持有结果的新Stram

        Stream操作是延迟执行的,会等到需要结果的时候才执行


8、Stream使用步骤

        创建:

        创建一个流。

        中间操作:

        在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作

        终止操作:

        使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该         Stream就不能使用了


9、创建Stream

通过Collection对象的stream()或parallelStream()方法

通过Arrays类的stream()方法。

通过Stream接口的of()、iterate()、generate()方法

通过InStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。


10、中间操作、终止操作

中间操作:

        filter、limit、skip、distinct、sorted

        map

        paraller

  1. package com.qf.webpro2105.test;
  2. import java.util.ArrayList;
  3. import java.util.function.Function;
  4. import java.util.stream.Stream;
  5. public class Test12 {
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. ArrayList<Student> stus = new ArrayList<Student>();
  9. stus.add(new Student("wangbao", 23));
  10. //stus.add(new Student("agui",20));
  11. stus.add(new Student("huangqi", 18));
  12. stus.add(new Student("taoshier", 22));
  13. stus.add(new Student("agui", 20));
  14. //stus.add(new Student("huangqi",18));
  15. //创建流
  16. Stream<Student> stream = stus.parallelStream();
  17. //对流进行操作
  18. //1、过滤操作
  19. stream.filter(t->t.getAge()<=20).forEach(System.out::println);;
  20. //2、只获取流中的指定个数的元素
  21. stream.limit(3).forEach(System.out::println);
  22. //3、跳过获取
  23. stream.skip(2).forEach(System.out::println);
  24. //4、去重---注意需要重写hashCode equals
  25. stream.distinct().forEach(System.out::println);
  26. //5、排序
  27. stus.stream().sorted((o1,o2)->{return o1.getAge()-o2.getAge();}).forEach(System.out::println);
  28. //6、map
  29. Function<Student, String> fun = t -> t.getName();
  30. stus.stream().map(t -> t.getName()).forEach(System.out::println);
  31. // System.out.println("--------------------------------");
  32. // for(Student stu:stus){
  33. // System.out.println(stu);
  34. // }
  35. }
  36. }

终止操作:

        forEach、min、max、count

        reduce、collect

  1. package com.qf.javasepro2105.day25;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Optional;
  6. import java.util.stream.Collectors;
  7. public class StreamDemo3 {
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. ArrayList<Student> stus=new ArrayList<Student>();
  11. stus.add(new Student("wangjiabao",23));
  12. stus.add(new Student("zhenghaotian",18));
  13. stus.add(new Student("taoxiansheng",22));
  14. stus.add(new Student("agui",20));
  15. //终止操作
  16. //1、forEach
  17. //2、min
  18. //Optional<Student> minAge=stus.stream().min((o1,o2)->o1.getAge()-o2.getAge());
  19. //System.out.println(minAge.get());
  20. //3、max操作同min相同
  21. //4、个数
  22. long count=stus.stream().count();
  23. System.out.println("个数:"+count);
  24. //5、规约 reduce
  25. Optional<Integer> totalAge=stus.stream().map(s->s.getAge()).reduce((x,y)->x+y);
  26. System.out.println("总年龄:"+totalAge.get());
  27. //6、收集操作
  28. List<String> names=stus.stream().map(s->s.getName()).collect(Collectors.toList());
  29. for(String name :names){
  30. System.out.println(name);
  31. }
  32. }
  33. }

forEach

  1. package com.qf.webpro2105.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.stream.Stream;
  5. public class Test11 {
  6. public static void main(String[] args) {
  7. List<String> list = new ArrayList<String>();
  8. list.add("38");
  9. list.add("10");
  10. list.add("90");
  11. //创建Stream
  12. //创建流的时候,数据类型要与集合中的数据类型保持一致
  13. Stream<String> stream = list.parallelStream();
  14. //终止操作 将集合中的元素进行遍历
  15. //他只是将集合中的元素进行遍历,
  16. //但是遍历出来的顺序并不是我们添加进集合中的顺序
  17. // stream.forEach(t -> System.out.println(t));
  18. stream.forEach(System.out::println);
  19. }
  20. }

Arrays

  1. String[] array = {"38","10","90"};
  2. Stream<String> stream1 = Arrays.stream(array);
  3. stream1.forEach(System.out::println);

of方法 

  1. Stream<Integer> stream2 = Stream.of(10,100,30,80,50);
  2. stream2.forEach(System.out::println);

迭代流

  1. Stream<Integer> iterate = Stream.iterate(0, x->x+2);
  2. //limit 从0开始只要五个
  3. iterate.limit(5).forEach(System.out::println);

生成流

  1. Stream<Integer> generate = Stream.generate(()->new Random().nextInt(100));
  2. generate.limit(3).forEach(System.out::println);


11、新时间API

之前时间API存在的问题:线程安全问题,设计混乱。

本地化日期时间 API:

        LocalDate

        LocalTime

        LocalDateTime

Instant:时间戳

Zoneld:时区

Date、Instant、LocalDateTime的转换

DateTimeFormatter:格式化类

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/52988
推荐阅读
相关标签
  

闽ICP备14008679号