Java 如果结果已经存在于另一个变量中,则在列表中查找,然后分配给变量将返回null

Java 如果结果已经存在于另一个变量中,则在列表中查找,然后分配给变量将返回null,java,anylogic,Java,Anylogic,我有两个变量和一个列表,我正在从中查找要分配给变量的项: var_A = tl_1; var_B = findFirst(ground.getTargetLines(), n->n.getName().equals("tl_1")); 如果我为var_B执行的查找包含与var_A相同的结果,我将得到null。如果var_A为空或包含其他值,则可以为var_B分配查找结果 请问我遗漏了什么?有问题的部分 这里的问题是AnyLogic类型的getName()函数的行为 我尝试了Target

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

var_A = tl_1;

var_B = findFirst(ground.getTargetLines(), n->n.getName().equals("tl_1"));
如果我为var_B执行的查找包含与var_A相同的结果,我将得到null。如果var_A为空或包含其他值,则可以为var_B分配查找结果

请问我遗漏了什么?

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

我尝试了TargetLine类型(从
com.anylogic.engine.markup.AbstractMarkup
继承
getName()
),也尝试了矩形形状(从
com.anylogic.engine.presentation.Shape继承
getName()
),它们的行为都是一样的

AnyLogic文档对
Shape
getName()

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

TargetLine
getName()
的解释类似

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

以下是一个行为示例:

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

可能的解决办法
  • 不将正在搜索的对象分配给任何逻辑变量(可以使用正常的Java变量,这很好)
  • 通过将此信息存储在Java映射或类似文件中,并在按名称搜索实例时访问此ressource来跟踪名称实例配对
结论 综上所述,AnyLogic文档应该说明的内容更像这样:

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

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

我尝试了TargetLine类型(从
com.anylogic.engine.markup.AbstractMarkup
继承
getName()
),也尝试了矩形形状(从
com.anylogic.engine.presentation.Shape继承
getName()
),它们的行为都是一样的

AnyLogic文档对
Shape
getName()

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

TargetLine
getName()
的解释类似

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

以下是一个行为示例:

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

可能的解决办法
  • 不将正在搜索的对象分配给任何逻辑变量(可以使用正常的Java变量,这很好)
  • 通过将此信息存储在Java映射或类似文件中,并在按名称搜索实例时访问此ressource来跟踪名称实例配对
结论 综上所述,AnyLogic文档应该说明的内容更像这样:

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


向我们展示findFirst()方法的代码?感谢您的快速回复。它是ju
traceln(rectangle.getName()); //prints "rectangle"
myRectangle = rectangle;      //assign to AnyLogic Variable
traceln(rectangle.getName()); //prints "myRectangle"