java8函数式接口IntPredicate 避免自动装箱问题

关于自动装箱和拆箱的问题,在java8中也有一些改动,可以提高程序的性能。装箱就是把原始基本的数据类型包装为对象类型,
拆箱表示将对象类型拆分为基本的数据类型。装箱后的值的本质就是把原始类型包装起来,并保存在堆里。因此
装箱后的值需要更多的内存空间。并需要额外的内存搜索来获取被包裹的原始值。
java8在函数式接口引入的时候,也引入了一系列的接口,可以避免这种自动装箱操作。比如IntPredicate等,下面就
以intPredicate为例,来看一下该函数式接口的实现:

package java.util.function;

import java.util.Objects;

/**
 * 接收一个int类型的值来返回一个预测的布尔值。该类是Predicate的一个int类型的特殊化。
 * @since 1.8
 */
@FunctionalInterface
public interface IntPredicate {

    /**
     * 评测给定参数的当前谓词的值
     *
     * @param value 输入参数
     * @return {@code true} 如果输入参数匹配了谓词,就返回true, 否则返回 false
     */
    boolean test(int value);

    /**
     * 返回一个组合的谓词,代表了一个当前谓词与another这个谓词短路逻辑与的结果。
     * 当进行评估的时候,如果当前谓词是false,那么other这个谓词就不会参与评估。
     *  任何异常都会在评估谓词期间被抛出并返回给调用者。如果当前谓词评估抛出异常,
     *  other就不会进行评估。
     * @param other 另外一个predicate将和当前的predicate进行逻辑and运算。
     * @return 返回一个组合的predicate,代表当前predicate和other predicate之间进行逻辑与的结果。
     * @throws 如果other为null,就会抛出NullPointerException异常。
     */
    default IntPredicate and(IntPredicate other) {
        Objects.requireNonNull(other);
        return (value) -> test(value) && other.test(value);
    }

    /**
     * 返回一个predicate,代表当前predicate的逻辑否定
     * @return 返回当前predicate的一个逻辑否定的predicate.
     */
    default IntPredicate negate() {
        return (value) -> !test(value);
    }

    /**
     * 返回一个组合的谓词,代表了一个当前谓词与another这个谓词短路逻辑OR的结果。
     * 当进行评估的时候,如果当前谓词是false,那么other这个谓词就不会参与评估。
     *  任何异常都会在评估谓词期间被抛出并返回给调用者。如果当前谓词评估抛出异常,
     *  other就不会进行评估。
     *  任何异常都会在评估谓词期间被抛出并返回给调用者。如果当前谓词评估抛出异常,
     *  other就不会进行评估。
     * @param other 另外一个predicate将和当前的predicate进行逻辑OR运算。
     * @return 返回一个组合的predicate,代表当前predicate和other predicate之间进行逻辑OR的结果。
     * @throws 如果other为null,就会抛出NullPointerException异常。
     */
    default IntPredicate or(IntPredicate other) {
        Objects.requireNonNull(other);
        return (value) -> test(value) || other.test(value);
    }
}

实验代码:

package com.com.java.learn;

import java.util.function.IntPredicate;

/**
 *@author:liyongyong
 *@description: IntPredicate  避免自动装箱问题。
 *@date 2019/2/12
 */
public class IntPredicateTest {

    public static void main(String[] args){
        IntPredicate num = (int i)->i%100 == 0;
        System.out.println(num.test(100));//true
        IntPredicate num1 = (int i)->i%2==0;
        System.out.println(num1.and(num).test(50));//false
        System.out.println(num1.and(num).test(100));//true
        System.out.println(num1.or(num).test(50));//true
        System.out.println(num1.negate().test(50));//false
    }
}

java8函数式接口IntPredicate 避免自动装箱问题_第1张图片

你可能感兴趣的:(JAVA)