Java 遍历并从列表中查找对象字段的最佳方法
我有一个自定义对象列表,我想通过给定一个Id(自定义对象中的一个字段)找到一个对象。我为此编写了代码,所以在比较字段时发现了两种解决方案 一,Java 遍历并从列表中查找对象字段的最佳方法,java,list,equals,Java,List,Equals,我有一个自定义对象列表,我想通过给定一个Id(自定义对象中的一个字段)找到一个对象。我为此编写了代码,所以在比较字段时发现了两种解决方案 一, 私有产品getProduct(字符串productId,列表productList){ 对于(int i=0;iproductId.equals(p.getId()) .findFirst() .orElse(空); 我知道结果有一些,但我认为equals有一些东西,这取决于它是如何实现的used@AdnanAli别担心,equals被定义为x.equa
私有产品getProduct(字符串productId,列表productList){
对于(int i=0;i
二,
私有产品getProduct(字符串productId,列表productList){
对于(int i=0;i
区别在于
如果条件,我想知道哪一个更好,为什么,何时使用第一种方法,何时使用第二种方法?第一种方法调用等于参数productId
,而第二个函数从productList
对当前列表元素调用equals
。结果是相同的,因为是对称的:
对于任何非空参考值x
和y
,x.equals(y)
应在且仅当y.equals(x)
返回true时返回true
您也可以为此使用流,因此不必关心实现细节(此外,它是空安全的):
查看问题以获取更多信息。第一个调用参数productId
上的equals
,而第二个调用productList
中当前列表元素上的equals
。结果是相同的,因为是对称的:
对于任何非空参考值x
和y
,x.equals(y)
应在且仅当y.equals(x)
返回true时返回true
您也可以为此使用流,因此不必关心实现细节(此外,它是空安全的):
查看一个问题以获取更多信息。由于Java将equals()
定义为对称,因此这两个代码段之间没有区别
这两个代码段都是次优的,因为它们通过数值索引进行迭代,并在返回之前检索productList.get(i)
两次。按索引进行迭代尤其危险,因为传递LinkedList
会大大降低搜索速度
更好的方法是对每种形式的循环使用:
for (Product p : productList) {
if (p.getId().equals(productId)) {
return p;
}
}
return null;
由于Java将equals()
定义为对称,因此这两个代码段之间没有区别
这两个代码段都是次优的,因为它们通过数值索引进行迭代,并在返回之前检索productList.get(i)
两次。按索引进行迭代尤其危险,因为传递LinkedList
会大大降低搜索速度
更好的方法是对每种形式的循环使用:
for (Product p : productList) {
if (p.getId().equals(productId)) {
return p;
}
}
return null;
当您确定产品id从不为空时,这并不重要
但总的来说,以一种防御的方式编程总是好的,所以例如,更喜欢使用
"SomeString".equals(aString)
而不是
aString.equals("SomeString")
因为您知道“SomeString”永远不会null
或使用
Objects.equals(object1, object2)
当两个对象都可能为null
时,当您确定产品id永远不为null时,这并不重要
但总的来说,以一种防御的方式编程总是好的,所以例如,更喜欢使用
"SomeString".equals(aString)
而不是
aString.equals("SomeString")
因为您知道“SomeString”永远不会null
或使用
Objects.equals(object1, object2)
当两个对象都可能为null
时,两个实现中的问题都是在null值上调用.equals的可能性
如果您可以保证它们都不是空的,那么它们是等价的
如果您使用的是Java8,流可能是更好的选择
private Product getProduct(String productId,List<Product> productList){
return products.stream()
.filter(p-> productId.equals(p.getId())
.findFirst()
.orElse(null);
私有产品getProduct(字符串productId,列表productList){
return products.stream()
.filter(p->productId.equals(p.getId())
.findFirst()
.orElse(空);
两种实现中的问题都是在空值上调用.equals的可能性
如果您可以保证它们都不是空的,那么它们是等价的
如果您使用的是Java8,流可能是更好的选择
private Product getProduct(String productId,List<Product> productList){
return products.stream()
.filter(p-> productId.equals(p.getId())
.findFirst()
.orElse(null);
私有产品getProduct(字符串productId,列表productList){
return products.stream()
.filter(p->productId.equals(p.getId())
.findFirst()
.orElse(空);
我知道结果有一些,但我认为equals有一些东西,这取决于它是如何实现的used@AdnanAli别担心,equals
被定义为x.equals(y)=y.equals(x)
,所以顺序不重要。我知道结果是有一些,但我认为equals有一些东西,这取决于它是怎样的used@AdnanAli别担心,equals
被定义为x.equals(y)=y.equals(x)
,所以顺序并不重要。