java8新特性普及

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 names = new ArrayList();

        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 list, Predicate 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");
    }
}

你可能感兴趣的:(jdk1.8,java8)