第4章 类库

数据类型

  • int占用4字节,Integer占用16字节;Integer为整形对象
  • 在最坏的情况下,Integer[]要比int[]多占用6倍的内存
  • 所以拆箱效率比装箱快
    public static void mapToFun() {
        System.out.println(Stream.of(new Integer(20)).mapToInt(x -> x.intValue()).count());
        System.out.println(Stream.of(new Integer(20)).mapToLong(x -> x.longValue()).count());
        System.out.println(Stream.of(new Integer(20)).mapToDouble(x -> x.doubleValue()).count());
    }

    public static void intStream() {

        System.out.println(IntStream.of(1, 2, 3).average().getAsDouble());
        System.out.println(IntStream.of(1, 2, 3).max().getAsInt());
        System.out.println(IntStream.of(1, 2, 3).min().getAsInt());
        System.out.println(IntStream.of(1, 2, 3).findFirst().getAsInt());
        System.out.println(IntStream.of(1, 2, 3).findAny().getAsInt());
        System.out.println(IntStream.of(1, 2, 3).count());
        System.out.println(IntStream.of(1, 2, 3).sum());
        System.out.println(IntStream.of(1, 2, 3).limit(2).findFirst().getAsInt());
        IntStream.range(1, 10).forEach(x -> System.out.println(x));

    }

Optional

    public static void OptionalTest() {
        System.out.println(Optional.of("ab").get());
        //        System.out.println(Optional.of(null).get());//NPE
        System.out.println(Optional.ofNullable(null).orElse("bb"));
        System.out.println(Optional.empty().orElse("bb"));
        System.out.println(Optional.of("aa").orElse("bb"));
    }

重载解析

  • 用lambda做为参数传递的时候遵守以下原则
  • 若只有一个可能的目标类型,由相应的函数接口的参数类型推导得出
  • 若有多个可能的目标类型,由相应的函数接口参数类型推导得出
  • 若有多个可能的目标类型且最具体的目标类型不明确的时候,需要人为进行指定lambda的参数类型

default


interface Parent {

    public default void welcome() {
        System.out.println("this is parent");
    }
}

class ParentImpl implements Parent {

}
  • 使用default定义的接口方法不需要子类必须实现
  • 若ParentImpl override了welcome方法,则会走ParentImpl方法

多继承

interface Person {
    public default void welcome() {
        System.out.println("this is person");
    }
}

interface Parent {

    public default void welcome() {
        System.out.println("this is parent");
    }
}

class MultiChild implements Person, Parent {

    @Override
    public void welcome() {
        System.out.println("this is MultiChild");
    }
}
class ChildImpl {
    public void welcome() {
        System.out.println("this is ChildImpl");
    }
}

interface Parent {

    public default void welcome() {
        System.out.println("this is parent");
    }
}

class OverrideChildImpl extends ChildImpl implements Parent {

}


      new OverrideChildImpl().welcome();//输出 this is ChildImpl
  • MultiChild实现了Parent,Person都有welcome方法,则子类MultiChild必须指定自己的welcome
  • 子类只能一个了父类,但是可以有多个接口实现
  • OverrideChildImpl继承的父类和实现的接口当中都有welcome方法,则优先会走父类的方法;类优于接口
  • 若OverrideChildImpl当中override了welcome方法,那么就会走子类的方法