几个使用场景
上面几个,是否像我们调用一个方法,调用方法的时候,有这几种形式:
传参数,有返回值:Predicate,Function
传参数,无返回值:Consumer
不传参数,有返回值:Supplier
所以我们调用匿名类的时候,基本都可以用上面几种内置的函数式接口,而不用自己特意去为了一个匿名类定义接口。
其他函数式接口
在java.util.function包中,我们可以看到IntPredicate、IntFunction、IntSupplier、IntConsumer、LongConsumer、LongFunction、LongPredicate、LongSupplier等,是为了在输入和输出都是原始类型时,避免自动装箱的操作。
java的自动装箱机制虽然可以让我们在原始类型和引用类型之间的装箱和拆箱操作是自动完成的,但这在性能方面是要付出代价的。装箱后的值本质上就是把原始类型包裹起来,并保存在堆里。因此,装箱后的值需要更多的内存,并需要额外的内存搜索来获取被包裹的原始值。
比如下面这个,是没有装箱的:
IntPredicate evenNumbers = (int i) -> i % 2 == 0;
evenNumbers.test(1000);
下面这个,是有装箱的:
Predicate oddNumbers = (Integer i) -> i % 2 == 1;
oddNumbers.test(1000);
方法引用