JDK8主要新特性介绍(二)

1.6  类库新特性

       java.util.stream 类库包新特性

       ●java.util.Optional 类新特性

       ●java.util.Base64 类新特性

       ●Java.time 类新特性

       ●其它常用类新增特性

       ●HashMap类性能提升

1.6.1 java.util.stream 类库包新特性
Stream流的特性
           定 义:支持数据处理操作的源生成的元素序列。它并非是数据结构,也不是容器,而是一个过程.
 引入的原因:1.声明性方式处理数据集合   2.透明地并行处理,提高性能
     重要特点:1. 内部迭代                           2. 数据流(类似管道)传输

Stream数据类型

              

Stream流操作的分类:
         1.中间操作:可以连接起来的流操作
         2.终端操作:关闭流的操作,触发流水线执行并关闭它。
特        点:一个流的操作,没有终端操作 ,则该流中的任何中间操作操作都不会执行。

              

Stream流的使用:
          一个数据源(如源集合)来执行一个操作(如映射).
          一个中间操作链(如筛选),形成一条流的流水线.
          一个终端操作(如归约),执行流水线,并能生成结果.

         

流的构建:

         

 Stream流典型的接口方法:

      1 filter  (Predicate<? super T> predicate); 用于过滤、筛选   2  distinct(); 去重  [会依赖hasCode和equals]

                          

        3 map (Function<? super T ,  ? extends R> mapper);
           * 对于Stream中包含的元素使用给定的转换函数进行转换操作,把所有的返回值组成新的流。
           * 传入User对象(User流),提取里面的所有name属性,转换为一个Strea,的流
           * 新生成的Stream只包含转换生成的元素。

             

  Stream 流 - 收集数据:

        对流调用 collect 方法将对流中的元素触发归约操作(由 Collector 来参数化), 将流中的元素累计成一个汇总结果。Collectors 实用类提供了许多静态工厂方法,用来创建常见收集器的实例.
       Collectors.toList() 返回类型List<T> ,把流中的所有项目收集到一个List。
       Collectors.toSet() 返回类型Set<T>, 把流中的所有项目收集到一个Set。
       Collectors.toCollection(Supplier collecttionFactory)返回类型Collection<T>, 把流中的所有项目收集到给定的供应源创建的集合。
       Collectors.counting()方法返回的收集器,查看集合数量.如:menu.stream().collect(counting());
       Collectors.maxBy(Comparator<? super T> comparator) 根据比较器,获取最大值;
             如:userLists.stream().collect(maxBy(Comparator.comparing(User::getAge)));
       Collectors.minBy(Comparator<? super T> comparator) 根据比较器,获取最小值;
       Collectors.summingInt/summingDouble/summingLong() 汇总对象映射为求和的int/Double/Long函数;
             如:userLists.stream().collect(summingInt(User::getAge));
       Collectors.averagingInt/averagingDouble/averagingLong() 汇总对象映射为平均值的int/Double/Long函数;
             如:userLists.stream().collect(averagingInt(User::getAge));
        Collectors.joining()返回的收集器会把对流中的每一个对象应用toString()后连接成一个字符串,内部使用StringBuilder;重载:参数是分隔符. 如:userLists.stream().map(User::getAge).collect(joining(","));

      

  Stream并行流:

             

1.6.2 java.util.Optional 类新特性

       Optional被定义为一个简单的容器,其值可能是null或者不是null,Java 8之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,而在Java 8 以后,不推荐你返回null而是返回Optional。

        java.util.Optional<T>,对可能缺失的值建模.引入的目的并非是要消除每一个 null引用,而是帮助你更好地设计出普适的 API.

 Optional的优点
       1)显式的提醒你需要关注null的情况,对程序员是一种字面上的约束
       2)将平时的一些显式的防御性检测给标准化了,并提供一些可串联操作
       3)解决null会导致疑惑的概念

Optional对象的创建
      empty()          声明一个空的Optional,eg:Optional<User> optU =  Optional. empty();
      of(T value)     为非null的值创建一个Optional.通过工厂方法创建Optional类。创建对象时传入的参数不能为nul,如果为null,则抛出NullPointerException.
      ofNullable(T value)  为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional,可以接受参数为null的情况。

常用 方法
      isPresent()     如果值存在返回true,否则返回false。
      get()              如果Optional有值则将其返回,否则抛出异常 NoSuchElementException。
      ifPresent(Consumer<? super T> consumer) 如果Optional实例有值则为其调用consumer,否则不做处理
      orElse(T other) 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。即参数other为默认返回值,eg:myValue.orElse("传入的参数value!")
      orElseGet(Supplier<? extends T> other) 如果Optional实例有值则将其返回,否则调用other Lambda的get方法返回默认值,eg:myValue.orElseGet(() -> "Default Value")
      orElseThrow(Supplier<? extends X> exceptionSupplier)如果有值则将其返回,否则抛出supplier接口创建的异常。eg:

public static void main(String[] args) {
    try { //orElseThrow与orElse方法类似。与返回默认值不同,
          //orElseThrow会抛出lambda表达式或方法生成的异常
          empty.orElseThrow(ValueAbsentException::new);
         } catch (Throwable ex) {
           //输出: No value present in the Optional instance
           System.out.println(ex.getMessage());
     }
}

class ValueAbsentException extends Throwable {
    public ValueAbsentException() {super();}
    public ValueAbsentException(String msg) {super(msg); }
    @Override
    public String getMessage() {
       return "No value present in the Optional instance"; 
    }
}

    map(Function<? super T,? extends U> mapper)  如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。eg:Optional<String> upperName = myValue.map((value) -> value.toUpperCase());
    flatMap(Function<? super T,Optional<U>> mapper)    如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。    
   filter(Predicate<? super T> predicate)  如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。filter个方法通过传入限定条件对Optional实例的值进行过滤。对于filter函数我们可以传入实现了Predicate接口的lambda表达式。

1.6.3 java.util.Base64 类新特性

      Base64已经是 JDK的标准类库,支持Base64的编解码。

                  

1.6.4 Java.time 类新特性

                  

1.6.5 其它常用类新增特性

                          

1.6.6 HashMap类性能提升

                          

                            

1. 7 JAVA虚拟机(JVM)新特性

                           

   1. 8 新增工具特性

        jjs 工具:Nashorm 引擎,可以用来解析javascripts脚本                 

        ●Jdeps工具:java类的依赖分析工具。

 

ps:https://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值