【问题标题】:Finding in a list, then assigning to a variable returns null if result already exists in another variable如果结果已存在于另一个变量中,则在列表中查找,然后分配给一个变量返回 null
【发布时间】:2019-07-05 07:26:28
【问题描述】:

我有两个变量和一个列表,我正在寻找要分配给变量的项目:

var_A = tl_1;

var_B = findFirst(ground.getTargetLines(), n->n.getName().equals("tl_1"));

如果我为 var_B 执行的查找包含与 var_A 相同的结果,我会得到 null。如果 var_A 为空或包含不同的值,则可以为 var_B 分配查找结果。

请问我错过了什么?

【问题讨论】:

  • 向我们展示 findFirst() 方法的代码?
  • 感谢您的快速回复。 . .它只是 Java 8 Streams API 的 findFirst() 方法
  • 所以var_B的类型是Optional<T>?
  • 为什么这个问题被标记为javascriptanylogic
  • @TheHeadRush 是的,没错

标签: java anylogic


【解决方案1】:

有问题的部分

这里的问题是 AnyLogic 类型的 getName() 函数的行为。

我尝试了 TargetLine 类型(从 com.anylogic.engine.markup.AbstractMarkup 继承 getName()),也尝试了 RectangularShape(从 com.anylogic.engine.presentation.Shape 继承 getName()),它们的行为都相同。

AnyLogic 文档对ShapegetName() 解释如下:

getName():如果形状被声明为可呈现对象类(代理或实验)中的字段,例如如果它是在图形编辑器中绘制的,则返回字段的名称,否则返回字符串 UNKNOWN_NAME。

TargetLinegetName()的解释类似。

意外行为

当您将 TargetLineRectangularShape 的实例或其他 AnyLogic 特定类的实例分配给 AnyLogic(!) 变量(表示在画布上以图形方式定义的变量)时,getName() 的结果将将此实例的属性中的图形编辑器中定义的名称更改为分配给它的变量的名称。从这一刻起,您可以不再检索最初定义的名称,因为它已在内部更改为变量的名称。然而实例仍然是相同的,只是 getName() 函数的返回值发生了变化。

以下是该行为的示例:

traceln(rectangle.getName()); //prints "rectangle"
myRectangle = rectangle;      //assign to AnyLogic Variable
traceln(rectangle.getName()); //prints "myRectangle"

这解释了为什么在您将按名称搜索的列表成员分配给 AnyLogic 变量后,您的 lambda 表达式(以及使用 getName() 函数的简单循环)将无法按预期工作。

可能的解决方法

  • 不将您正在搜索的对象分配给 AnyLogic 变量(您可以使用普通的 Java 变量,这样可以正常工作)
  • 通过将此信息存储在 Java Map 或类似文件中并在按名称搜索实例时访问此资源来跟踪名称-实例配对自己

结论

总而言之,AnyLogic 文档的状态应该更像这样:

getName():如果形状被声明为可呈现对象类(代理或实验)中的字段,例如如果它是在图形编辑器中绘制的,则返回字段的名称,否则返回字符串 UNKNOWN_NAME。如果将形状分配给 AnyLogic 变量(在图形编辑器中绘制的变量),则返回此变量的名称。例如。运行代码myVar = myShape; 后,getName() 将返回 myVar 而不是 myShape

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2021-10-24
    • 2012-06-26
    • 2019-08-16
    • 2021-05-06
    • 2018-07-20
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多