我有一个ArrayList
(invProperty
),其中有两个字段invoice_no
和invoice_qty
。我想将项目添加到新ArrayList
(newProperty
),其中invoice_no
等于某个值(invNumber
)。我正在检查第一个ArrayList。我想出了两种方法,我想知道哪种方法更好,还是有其他解决方案?
invProperty
是第一个ArrayList,newProperty
是新的ArrayList。 invNumber
是我正在检查的值,
for (InvoiceSubData s : invProperty) {
if (invNumber.equals(s.getInvoiceNo())) {
newProperty.add(s);
}
}
for (InvoiceSubData s : invProperty) {
if (s.getInvoiceNo().contains(invNumber)) {
newProperty.add(s);
}
}
答案 0 :(得分:3)
根据您的标准,您应该使用第一个。第二个可以给你不想要的结果。
例如:如果您的发票编号为" 41235"并且列表中有一个发票编号有" 123"然后它将生成真("41235".contains("123"))
并添加到新创建的列表中。
如果您可以在项目中使用Java 8
,也可以执行此操作
newProperty = invProperty.stream()
.filter(item -> invNumber.equals(item.getInvoiceNo()))
.collect(Collectors.toList());
答案 1 :(得分:2)
你可以使用java 8流来做到这一点:
List<InvoiceSubData> newProperty = invProperty.stream()
.filter(x -> invNumber.equals(x.getInvoiceNo()))
.collect(Collectors.toList());
答案 2 :(得分:1)
由于您要检查是否相等,因此需要使用第一个版本(使用.equals()
)。
第二个不正确,因为它也会返回那些子集。例如。 aaa.contains("a")
将返回true
,但显然不需要。
答案 3 :(得分:0)
您可以使用lambda表达式:
List<InvoiceSubData> newProperty = invProperty.stream().filter(x -> invNumber.equals(x.getInvoiceNo())).collect(Collectors.toList());
答案 4 :(得分:-1)
这个消除了一个额外的循环
$state.go('CustomerDetails')