【发布时间】:2019-04-09 23:12:18
【问题描述】:
我开始学习如何在 java8 中使用Optional 进行开发。可能是有人记录在案,但我一直在使用谷歌,但没有准确的结果。
orElseGet 方法有不同的可能实现,我不确定 java 在某些情况下是否可以更好地处理内存,或者是否几乎相同。
假设我在一个定义了Optional 的类中有一个方法:
class myClass {
final static private Supplier<Object> MY_SUPPLIER = () -> new Object();
private void myMethod1 () {
Optional<Object> x; // somehow Initialized
Object y = x.orElseGet(() -> new Object());
}
private void myMethod2 () {
Optional<Object> x; // somehow Initialized
Object y = x.orElseGet(MY_SUPPLIER);
}
}
从我谦虚的角度来看,这一秒在 java 中应该有更好的内存管理,因为它只声明了一次 Supplier,并且总是使用相同的。
1) 这是真的吗?
现在,让我们更进一步,假设我们需要根据参数提供不同的对象。
class myClass2 {
final static private Function<String, Supplier<AnyCustomClass>> MY_SUPPLIER_PROVIDER = (p) -> () -> new AnyCustomClass(p);
private void myMethod1 (String arg) {
Optional<AnyCustomClass> x; // somehow Initialized
AnyCustomClass y = x.orElseGet(() -> new AnyCustomClass(arg));
}
private void myMethod2 (String arg) {
Optional<AnyCustomClass> x; // somehow Initialized
AnyCustomClass y = x.orElseGet(MY_SUPPLIER_PROVIDER.apply(arg));
}
}
在这种情况下,根据参数,每次返回不同的供应商。
2) java 在这里也有更好的内存管理吗?
3) 他们是否以某种方式“缓存”了 arg 取相同的值?
编辑
通过观看Does a lambda expression create an object on the heap every time it's executed? ,我了解我的一流行为得到了解答。由于没有局部变量,所以会创建一个单例(至少是oracle jvm)
然而,我觉得这个答案不能提供准确的信息来回答我的 2) 和 3)
【问题讨论】:
-
链接的答案确实说它没有很好地定义不同的 JVM 将如何处理 lambda 缓存。
标签: java performance memory-management