Java1.8新特性学习

第一部分:Optional

简单介绍Optional的API

  • empty:返回一个空的Optional对象
  • of:入参:Object,返回一个Optional对象,如果入参是一个null,就会报空指针异常
  • ofNullable:入参Object,返回一个Optional对象,如果入参是一个null,会返回一个空的Optional对象
  • get: 如果Optional对象中有值就返回相应的值,如果没有值就报空指针异常
  • orElse:入参:Object,如果Optional对象中有个值得话,就返回这个值,不会返回入参;如果没有值,就会返回入参
测试代码:
Optional<Object> empty = Optional.ofNullable(null);
System.out.println("empty:"+empty.orElse("李四"));
Optional<String> optional = Optional.ofNullable("张三");
System.out.println("optional:"+optional.orElse("zhangsan"));
结果:
empty:李四
optional:张三
  • orElseGet :入参Supplier,如果optional对象中有数据,就会返回这个值,不会返回入参;如果没有值,就会返回入参
//测试orElseGet功能
System.out.println("==================测试orElseGet功能======================");
Optional<Object> empty_orElseGet = Optional.ofNullable(null);
System.out.println("empty:"+empty.orElseGet(()->"李四"));
Optional<String> optional_orElseGet = Optional.ofNullable("张三");
System.out.println("optional:"+optional.orElseGet(()->"zhangsan"));
结果:
empty:李四
optional:张三
源码:
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
  • orElseThrow:入参:指定一个异常;如果optional对象中有数据,就会返回这个值,不会报异常信息,如果没有值,就会报指定的异常信息
//测试orElseThrow功能
System.out.println("==================测试orElseThrow功能======================");
Optional<String> optional_orElseThrow = Optional.ofNullable("张三");
System.out.println("optional_orElseThrow:"+optional.orElseThrow(RuntimeException::new));
Optional<Object> empty_orElseThrow = Optional.ofNullable(null);
System.out.println("empty_orElseThrow:"+empty.orElseThrow(RuntimeException::new));
  • filter:入参Predicate,如果optional中的值满足条件,就返回一个含有这个值得optional对象,否则返回一个空的option对象
System.out.println("==================测试filter功能======================");
Optional<String> stringOptional = Optional.ofNullable("zhangsan");
System.out.println(stringOptional.filter(temp->temp.length()>5));
stringOptional=Optional.empty();
System.out.println(stringOptional.filter(temp->temp.length()>5));
结果:
zhangsan
Optional.empty
  • filter注意事项:Optional中的filter方法和Stream中的filter方法是有点不一样的,Stream中的filter方法是对一堆元素进
    行过滤,而Optional中的filter方法只是对一个元素进行过滤,可以把Optional看成是最多只包含一个元素
    的Stream
  • map:如果Option对象中有值可以对其进行修改,.返回值是一个含有这个值得Optional对象
//测试map功能
System.out.println("==================测试map功能======================");
Optional<String> stringOptional_map = Optional.ofNullable("zhangsan");
System.out.println(stringOptional_map.map(temp->temp.toUpperCase()).orElse("失败"));
stringOptional_map=Optional.empty();
System.out.println(stringOptional.map(temp->temp.toUpperCase()).orElse("失败"));
结果:
ZHANGSAN
失败
  • flagMap:如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否
    则就返回一个空的Optional对象.flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回
    值必须是Optional,map方法的mapping函数返回值可以是任何类型T。调用结束时,flatMap不会对结果
    用Optional封装。
System.out.println("==================测试flagMap功能======================");
Optional<String> stringOptional_flagMap = Optional.ofNullable("zhangsan");
System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list")));
stringOptional_flagMap=Optional.ofNullable(null);
System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list")));
  • ifPresent://ifPresent方法的参数是一个Consumer的实现类,Consumer类包含一个抽象方法,该抽象方法对传入的值进行处理,只处理没有返回值。
Optional stringOptional = Optional.of(“zhangsan”); 
stringOptional.ifPresent(e-> System.out.println(“我被处理了。。。”+e));

第二部分:Lambda表达式

Lambda 基本语法

(parameters) -> expression
或
(parameters) ->{ statements; }

- 做几点说明:
1. 可选的参数声明:可以声明参数的类型,编辑器可以统一识别
2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
3. 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

第一个实例:开启一个线程
//第一个例子,开启一个线程
new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(addNum(1,2));
        }
    }).start();
    new Thread(()-> System.out.println(addNum(1,2))).start();
//私有方法
private static int addNum(int arg1,int arg2){
    return arg1+arg2;
}
第二个例子:使用表示对集合进行迭代
//对集合进行迭代
    List<Integer> list = list();
    for (Integer integer : list) {
        System.out.println(integer);
    }

    list.forEach(System.out::println);
//生成一个随机数集合
private static List<Integer> list (){
    List<Integer> listNum = new ArrayList<>();
    for (int i= 0 ; i<10 ;i++){
        int  random = new Random().nextInt(100);
        listNum.add(random);
    }
    return listNum;
}

第三个例子:使用表达式filter过滤

** List<String> list = stringList();
    list.forEach(System.out::println);
    //过滤的条件
    Predicate<String>startWith=(n)->n.length()>3;
    list.stream().filter(startWith).collect(Collectors.toList()).forEach(System.out::println);**
//随机生成一个字符串
private static String string(){

    String str ="ABCDEFGHIJKMNOPQRSTUVWSYZ";
    StringBuilder stringBuilder = new StringBuilder();
    int r = new Random().nextInt(5);
    for (int i = 0; i <r+1 ; i++) {
       int random = new Random().nextInt(str.length());
        char charAt = str.charAt(random);
        stringBuilder.append(charAt);
    }
    return stringBuilder.toString();
}
//生成一个字符创的集合
private static List<String> stringList(){
    List<String> list = new ArrayList<>();
    for (int i = 0; i <10 ; i++) {
        list.add(string());
    }
    return list;
}