原始类型特化

引言

上篇我们介绍了三个函数式接口:Predicate、Consumer、Function 。还有一些函数式接口是专门为某些类型涉及的。https://www.jianshu.com/p/4c93e1f7c19b

Java 类型

  • 引用类型(如 Byte、Integer、Long、Object、List)
  • 原始类型(byte、short、int、float、double、long、char、boolean)

回顾知识点:

  • Java 类型要么是引用类型,要么是原始类型。
  • 泛型只能绑定到引用类型上面、这是由泛型内部的实现方式造成的。
  • 在 Java 中有一个将原始类型转换为对应的引用类型的机制、这个机智就叫做装箱。相反的操作、也就是将引用类型转换成对应的原始类型的机制,这种机智叫做拆箱。Java 还有一个自动装拆箱的机智来帮助我们程序员执行这一任务:装箱和拆箱都是自动完成的。

注意:

虽然 Java 提供了自动装拆箱的机智,但这在性能方面是要付出代价的,装箱的本质是就是把原始类型包裹起来,并保存在堆里。因此、装箱后的值需要更多的内存、并需要额外的内存搜索来获取被包裹的值。因此、为提高程序的执行效率、Java 8 为我们前面所提到的函数式接口提供了一个专门的版本、以便在输入和输出都是原始类型时避免自动装拆箱的操作。

举例

//IntPredicate 源码

@FunctionalInterface
public interface IntPredicate {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param value the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(int value);
  
    // 其他默认方法省略
    ...
}

说明

IntPredicate 源码解析:IntPredicate 类的 test方法接收一个原始类型 int类型的入参,其返回值为 boolean,避免了输入和输出都是原始类型时自动装拆箱的操作。

Java 8中的常用函数式接口

原始类型特化_第1张图片
原始类型特化_第2张图片
常用函数式接口

Lambdas及函数式接口的例子

原始类型特化_第3张图片
Lambdas及函数式接口的例子


推荐书籍

  • 《Java 8 in Action》

你可能感兴趣的:(原始类型特化)