java8新特性普及

来源:互联网 发布:文件管理网站源码 编辑:程序博客网 时间:2024/06/14 17:33

1.Lambda 表达式
2.函数式接口
3.Stream (流)
4.Date/Time API

java8新特性

  • lambda表达式:java8引入的

函数式接口

  • 函数式接口(只有一个方法的接口):让现有的功能和lambda表达式兼容
  • 函数式接口重要属性:可以使用lambda实例化它
  • @FunctionalInterface 添加注解(不是必须),只允许有一个抽象方法
  • 官方提供:java.util.Function包中
  • 方法引用:就是给lambda表达式去一个名字
    • class::new class::method

默认方法

  • 默认方法(default):目的向后兼容,旧的接口也能用到lambda表达式
    • 通俗的讲就是可以在interface中实现方法,这样旧的API就不用实现这个方法,
    • 而直接使用这个方法
    • 子类继承多个默认方法接口,出现默认方法冲突
      • 方法一:在子类中实现冲突的方法
      • 方法二:在子类中实现具体使用父类 如:FatherName.super.methodName()
  • 静态默认方法:可以在接口中添加一个静态的默认方法

Optional类

  • 含义:是一个容器对象,用于容纳非空对象
  • Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)
    • 用法:Optional.ofNullable(object1).orElse(object2)

Stream (流)

  • 流式操作,可以对集合进行并行处理和函数操作
  • Collection是一种面向内存的数据结构,Stream是面向计算的
  • 集合中两个创建流:
    • stream() 返回将集合作为源的连续流
    • parallelStream() 返回将集合作为源的并行流

相关方法:

  • forEach() 每个元素的迭代操作
  • map 将每一个元素映射到结果上
  • filter 过滤
  • limit 限制输出数
  • sorted 排序
  • Collector 用于统计的Collector来计算Stream处理完成后的所有统计数据

Date/Time API and java 内置Base64编码

  • 引进目的:修复就API的一些缺陷
  • java.time包引进新API:
    • Local:简化的date/time API,没有时区处理的特性。
    • Zoned:定制的date/time API,用于处理多时区的情况。
  • LocalDate LocalTime LocalDateTime

  • 枚举计时单位:java.time.temporal.ChronoUnit包内,添加枚举常量,替代旧API

  • 时间段:
    • Period:处理日期相关的时间段
    • Duration 处理时间相关的时间段
  • 时间调节器:
    • TemporalAdjuster 用于计算日期的数学工具
  • 向后兼容 toInstant方法转化为新API

Base64:

  • 三种类型的编解吗:
  • 简易模式:输出是完全按照A-Za-z0-9+/字符集映射的。
    • 编码不会自己增加输出行,解码器也不会接受任何超出A-Za-z0-9+/范围的内容。
  • URL模式:输出基于A-Za-z0-9+/的映射,但对于URL和文件名是安全的。
  • MIME模式:输出对于MIME类型的内容是友好的。如果超过76个字符,则会换行输出,
    • 并且换行符\n之后会自动添加一个\r。如果某行没有\r则说明输出的内容已经结束。
  • Base64.Encoder :编码
  • Base64.Decoder :解码
  • getEncoder():该方法返回一个使用基本Base64编码格式的Encoder对象。相反的解码方法是getDecoder()。
  • getUrlEncoder():该方法返回一个使用URL类型的Base64编码格式的Encoder对象。相反的解码方法是getUrlDecoder()。
  • getMimeEncoder():该方法返回一个使用MIME类型的Base64编码格式的Encoder对象。相反的解码方法是getMimeDecoder()
package com.java8;import java.time.*;import java.time.temporal.ChronoUnit;import java.time.temporal.TemporalAdjuster;import java.time.temporal.TemporalAdjusters;import java.util.*;import java.util.function.Predicate;import java.util.stream.Collector;import java.util.stream.Collectors;public class TestJava8 {    final static String aa = "hello";//    static String aa = "helll";    public static void main(String[]args){        TestJava8 tester = new TestJava8();        MathOperation addition = (a,b)->a+b;        System.out.println(addition.operation(1,2));        List<String> names = new ArrayList<String>();        names.add("Tom");        names.add("Jim");        names.forEach((x)-> System.out.println(x));        names.forEach(System.out::println);        List<Integer> lists = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);        System.out.println("All of the number");        System.out.println("test predicate");        eval(lists,n->true);        MathOperation.testStatic();        Optional<Integer> opt = Optional.empty();        System.out.println(opt.orElse(10));//        Optional.ofNullable(object1).orElse(object2)        Random random = new Random();        random.ints().limit(10).forEach(System.out::print);        List<Integer> tStream = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);        tStream.parallelStream().map(x->x+1).collect(Collectors.toList()).forEach(System.out::println);        System.out.println("=======================================");        testJava8_Date_Time();        System.out.println("=======================================");        timeBetween();        System.out.println("=======================================");        testBase64();    }    public static void testBase64(){        //简易模式编码        String stringEncoder = Base64.getEncoder().encodeToString("base64".getBytes());        System.out.println(stringEncoder);        System.out.println(new String(Base64.getDecoder().decode(stringEncoder)));        //url        String urlEncoder = Base64.getUrlEncoder().encodeToString("urlBase64".getBytes());        System.out.println(urlEncoder);        System.out.println(new String(Base64.getUrlDecoder().decode(urlEncoder)));        //Mime        String MimeEncoder = Base64.getMimeEncoder().encodeToString("MimeBase64".getBytes());        System.out.println(MimeEncoder);        System.out.println(                new String(Base64.getMimeDecoder().decode(MimeEncoder))        );    }    public static void timeBetween(){        LocalDate date1 = LocalDate.now();        LocalDate date2 = date1.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); //ChronoUnit.WEEKS))        System.out.println("data1:"+date1+"    date2:"+date2);        System.out.println(Period.between(date1,date2).getDays());        LocalTime time1 = LocalTime.now();        LocalTime time2 = time1.plus(111,ChronoUnit.MINUTES);        System.out.println("time1:"+time1+"  time2:"+time2);        System.out.println(Duration.between(time1,time2).getSeconds());    }    public static void testJava8_Date_Time(){        //获取当前的时间和日期        LocalDateTime localDateTime = LocalDateTime.now();        System.out.println("current date and time:"+localDateTime);        //输出当前的本地值       ;        System.out.println( localDateTime.toLocalDate());        LocalDate.of(2016, Month.DECEMBER,25);        //将字符串转为        ZonedDateTime date1 = ZonedDateTime.parse("2017-12-15T19:22:15+01:30[Europe/Paris]");        System.out.println(date1);        //设置时区ID为:        ZoneId id = ZoneId.of("Asia/Kolkata");        System.out.println(id);        //获取当前默认时区        ZoneId defaultDate = ZoneId.systemDefault();        System.out.println(defaultDate);    }    public static void eval(List<Integer> list, Predicate<Integer> predicate){        list.forEach(x->{            if(predicate.test(x)) {                System.out.print(x+",");            }        }            );    }}// 下面是定义的一些接口和方法interface MathOperation{    int operation(int a,int b);    default void test(){        System.out.println("test default");    }    static void testStatic(){        System.out.println("this is static static");    }}
原创粉丝点击