JAVA 8 的新特性

Java8的新特性有:默认方法、函数式接口、lambda表达式、方法引用、StreamOptional、日期API程序员

 1、默认方法:app

  接口中的方法能够有方法体可是必需要有static或者default修饰其余的方法都为抽象方法static修饰的方法不能被子接口继承 方法不能被覆写只能经过类名.方法名调用default修饰的方法能够被子接口继承也能够被覆写调用经过实现类的对象调用dom

2、函数式接口:ide

  接口中有且仅有一个抽象方法,通常都有@FuntionalInterface注解,即便没有注解它仍是函数式接口。函数

常见的函数式接口ComparetorRunnable。spa

3、lambda表达式:指针

  能够当作是匿名内部类的简写使用lambda表达式的接口必须为函数式接口code

    注:匿名内部类会编译产生两个class文件,但lambda表达式只会编译产生一个class文件。对象

 

    (参数1,参数2…)表示参数列表;->表示链接符;{}内部是方法体
    一、=右边的类型会根据左边的函数式接口类型自动推断;
    二、若是形参列表为空,只需保留();
    三、若是形参只有1个,()能够省略,只须要参数的名称便可;
    四、若是执行语句只有1句,且无返回值,{}能够省略,如有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
    五、形参列表的数据类型会自动推断;blog

    6lambda表达式中使用的局部变量默认会被final修饰,无论这个局部变量是在lamdba表达式里定义的仍是在表达式外定义的。所以只要是lambda表达式中使用过的局部变量就不能再修改了,无论在什么位置

 

4、方法引用:

    4.1 构造方法引用:

//匿名内部类
PersonFacotry facotry = new PersonFacotry() {
  @override
  public Person createPerson(String name, Integer age){ 
    //其余操做
    return new Person (name, age);
  }
};
//lambda表达式写法
PersonFacotry facotry1 = (name, age) -> new Person (name, age);

//lambda表达式简写(这种写法的函数式接口有几个参数,就调用其对应参数个数的构造方法)
PersonFacotry facotry2 = Person:: new;

Person person = facotry.createPerson ( name: "某某某", age: 100) ;
System.out.println(person);

    

    4.2静态方法引用

public class Test{
    public static void main(string[] args) {
        //匿名内部类方式
        Parseinterface pil = new ParseInterface(){ 
            @override
            public int parse(string str) {
                 return Integer.parselnt(str);
            }
        };

         // Lambda表达式常规写法
         ParseInterface pi2 = str->Integer.parseInt(str);

        // Lambda表达式简写
        ParseInterface pi3 = Integer::parseInt;   
    }
}     

 

    4.3实例方法引用

  Java1.8提供了一个函数式接口Function,接受两个参数

 

   匿名内部类方式

    string str ="Hello.world";
    //匿名内部类的方式
    Function<String,Boolean> func1= new Function<String,Boolean> (){
        @override
        public Boolean apply(strinq suffix) {
             return str.endswith (suffix);
        }
    };    

 

  Lambda表达式常规写法

// Lambda表达式常规写法
String str = "Hello.world";
Function<String,Boolean> func3 = t -> str.endsWith(t);
System.out.println(func3.apply("world"));

 

  Lambda表达式简写

// Lambda表达式常规写法
String str = "Hello.world";
Function<String,Boolean> func2 = t -> str::endsWith;
System.out.println(func2.apply("world"));

 

5、Stream

    Java 8 API添加了一个新的抽象称为流StreamStream API能够极大提升Java程序员的生产力,让程序员写出高效率、干净、简洁的代码

      注意:IO中的流是彻底不同的。

    在 Java 8 , 集合接口有两个方法来生成流:

      stream() 为集合建立串行流。经常使用

      parallelStream() 为集合建立并行流。

  Stream经常使用方法:

  ForEach:

      Stream 提供了新的方法 'forEach' 来迭代流中的每一个数据。如下代码片断使用 forEach 输出了10个随机数:

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);

  map:

    map 方法用于映射每一个元素到对应的结果,如下代码片断使用 map 输出了元素对应的平方数:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

// 获取对应的平方数 

List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

  filter:

    filter 方法用于经过设置的条件过滤出元素。如下代码片断使用 filter 方法过滤出空字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 

// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();

  limit:

    limit 方法用于获取指定数量的流。 如下代码片断使用 limit 方法打印出 10 条数据:

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);

  sorted:

    sorted 方法用于对流进行排序。如下代码片断使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random();

random.ints().limit(10).sorted().forEach(System.out::println);

  并行(parallel)程序:

    parallelStream 是流并行处理程序的代替方法。如下实例咱们使用 parallelStream 来输出空字符串的数量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

// 获取空字符串的数量 

int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

    咱们能够很容易的在顺序运行和并行直接切换。

  Collectors:

Collectors 类实现了不少归约操做,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("筛选列表: " + filtered);

String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));

System.out.println("合并字符串: " + mergedString);

 

6、Optional

  Optional对象能够为空,因此Optional 类的引入很好的解决空指针异常

    经过如下实例来了解Optional类的使用:

Public class User{

  private String name;

  private String password;

  ....

}

以往的判断方式:

public class Mytest{

  public static void main(String[] args){

       User user = new User();

    User.setPassword(“admin”);

    String name = getPwd(user);

    System.out.println(name);

  }

  public static String getPwd(User u){

    if(u==null){

      return “unknown”;

  }

   return u.getPassword();

}

 

使用Optional

public static String getPwd(User u){

  return Optional.ofNullable(u)

          .map(user->user.getPassword())

          .orElse(“unknown”);

};

 

7、日期Api

Jdk1.8给咱们提供了三个本地日期时间类:LocalDateLocalTime LocalDateTime

在不须要处理时区问题的时候,使用本地日期时间APILocalDateLocalTime LocalDateTime 

// 获取当前的日期时间

 LocalDateTime currentTime = LocalDateTime.now();

 System.out.println("当前时间: " + currentTime);

LocalDate date1 = currentTime.toLocalDate();

System.out.println("date1: " + date1);

Month month = currentTime.getMonth();

int day = currentTime.getDayOfMonth();

int seconds = currentTime.getSecond();

System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);

 

在须要处理时区的时候,使用时区的日期时间APIZonedDateTime ):

ZonedDateTime dd= ZonedDateTime.now();
System.out.println(dd);
ZonedDateTime date1 = ZonedDateTime.parse(dd.toString());
System.out.println("date1: " + date1);
ZoneId id = ZoneId.of(ZoneId.SHORT_IDS.get("CTT"));
System.out.println("ZoneId: " + id);
ZoneId currentZone = ZoneId.systemDefault();
System.out.println("当期时区: " + currentZone);
相关文章
相关标签/搜索