gpt4 book ai didi

java - 用 Optional.ofNullable(...).ifPresent(...) 替换 get/test/set of bare references?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:09 26 4
gpt4 key购买 nike

我有一个修改器方法,它只设置参数中提供的非空字段。该参数返回裸引用,而不是 Optional 包装器,并且无法更改。

在 Java 8 之前,一种方法是:

Double h = arg.getH();
if ( null != h ) setH( h );

Double v = arg.getV();
if ( null != h ) setV( v );

String s = arg.getS();
if ( null != s ) setS( s );

// Etc. ...

从 Java 8 开始,可以用一次性 Optional 更简洁地表达这一点。

Optional.ofNullable( arg.getH()).ifPresent( this::setH );
Optional.ofNullable( arg.getV()).ifPresent( this::setV );
Optional.ofNullable( arg.getS()).ifPresent( this::setS );
// Etc. ...

这个成语不太熟悉。但是,它也消除了潜在的错误源——例如上面“Java 8 之前”代码中的错误。

问题:频繁使用这种新模式是否有任何负面影响?(例如,它与早期模式相比在编译大小或性能方面如何? )

最佳答案

显然,您的任务是调整您的类型实例以反射(reflect)您无法控制的类型的属性。 (我有点担心//etc注释。)在那种情况下,我们可以将“transfer this property, if not null”封装为一个操作它是自己的:

// in MyType

static <T> BiConsumer<TypeOfArg,MyType> transfer(
Function<TypeOfArg,T> from, BiConsumer<MyType,T> to) {
return (arg,myself) -> {
T value = from.apply(arg);
if(value!=null) to.accept(myself, value);
};
}
static final BiConsumer<TypeOfArg,MyType> TRANSFER_ALL_PROPERTIES =
transfer(TypeOfArg::getH, MyType::setH).andThen(
transfer(TypeOfArg::getV, MyType::setV).andThen(
transfer(TypeOfArg::getS, MyType::setS)));

void mutatorMethod(TypeOfArg arg) {
TRANSFER_ALL_PROPERTIES.accept(arg, this);
}

我很确定,这也可能会引发关于这是否比 get-if-set 的普通序列更好的争论> 像您的第一个变体一样调用,但我认为,这也与熟悉度有很大关系。

对我来说,transfer(TypeOfArg::getV, MyType::setV)Optional.ofNullable( arg.getV()).ifPresent( this::setV ) 更能表达意图,读起来仍然很像命令式语句。

对于那些关心临时对象的人来说,代码不会创建任何对象。

关于java - 用 Optional.ofNullable(...).ifPresent(...) 替换 get/test/set of bare references?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com