gpt4 book ai didi

java - 在执行 .findFirst() 之前对所有值进行操作

转载 作者:行者123 更新时间:2023-11-30 07:48:38 24 4
gpt4 key购买 nike

我有以下代码(TrResponseTrNode 的代码无关):

public TrResponse from(final TrNode b1, final TrNode b2, final TrNode b3) {
final TrResponse resp = new TrResponse();
Stream.of(b1, b2, b3)
.filter(Objects::nonNull)
.findFirst()
.ifPresent(it -> {
resp.m1 = it.m1;
resp.m2 = it.m2;
resp.m3 = it.m3;
});
// b1, b2 or b3 can be null
// normalize() returns a mutated TrNode
resp.b1 = (null != b1) ? b1.normalize() : null;
resp.b2 = (null != b2) ? b2.normalize() : null;
resp.b3 = (null != b3) ? b3.normalize() : null;
return resp;
}

我正在尝试找出如何为所有 b1b2b3 执行 normalize 函数 (最终是非 null)在同一个流操作中,所以我不必稍后再进行那些 null 检查(就像我现在做的那样) ).我已经在 .findFirst() 之前尝试过 .map(TrNode::normalize),但它最终只将它应用于第一个找到的实例(如果有的话) .

有什么线索吗?

最佳答案

findFirst 正在做它应该做的事情。这是一个short-circuiting terminal operation .

您可以编写自己的收集器,它只接受第一个元素而忽略其他所有元素。 collect 没有短路,所以会处理每个元素。然后您可以像您尝试的那样使用 map

class FirstNode
{
private TrNode node;

public void setNode(final TrNode node)
{
if (this.node == null)
{
this.node = node;
}
}

public Optional<TrNode> first()
{
return Optional.ofNullable(node);
}
}

Stream.of(b1, b2, b3)
.map(TrNode::normalize)
.filter(Objects::nonNull)
.collect(
Collector.of(
FirstNode::new,
FirstNode::setNode,
(node, node2) -> node
)
)
.first()
.ifPresent(it -> {
resp.m1 = it.m1;
resp.m2 = it.m2;
resp.m3 = it.m3;
});

但这是否比您目前拥有的更好或更具可读性?并不真地。还值得注意的是,您将对所有内容进行规范化 - 这是必需的还是可取的?

关于java - 在执行 .findFirst() 之前对所有值进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013474/

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