2016-10-21 2 views
0

사용자 지정 개체 목록이 있고 Id (사용자 지정 개체의 필드)를 사용하여 개체를 찾고 싶습니다. 그래서 필드를 비교할 때 두 가지 해결책을 찾았습니다. 트래버스하고 목록에서 개체 필드를 찾을 수있는 가장 좋은 방법

private Product getProduct(String productId,List<Product> productList){ 
     for (int i = 0; i < productList.size(); i++) { 
      if (productId.equals(productList.get(i).getId())) { 
       return productList.get(i); 
      } 


     } 
     return null; 
    } 

2.

private Product getProduct(String productId,List<Product> productList){ 
     for (int i = 0; i < productList.size(); i++) { 
      if (productList.get(i).getId().equals(productId)) { 
       return productList.get(i); 
      } 
     } 
     return null; 
    } 

차이가 if 상태에

1

, 내가하면 경우에 첫번째 방법을 사용하는 다른 이유보다 낫다 어느 알고 싶어 두 번째 사용 하시겠습니까?

답변

0

productList 하나로부터 현재리스트 요소에 equals을 호출하면서 첫번째는, 상기 파라미터에 productIdequals을 호출한다. xy, x.equals(y)는 경우에만, y.equals(x) true를 반환 true를 돌려 null 이외의 참 값에 대한

: equals대칭 때문에 결과는 동일합니다.

당신이 구현 세부 사항 (또한, Objects#equals(Object, Object)가 null - 안전) 걱정하지 않아도 또한, 이것에 대한 스트림을 사용할 수 있습니다

String p = productList.stream().filter(e -> Objects.equals(e, productId)) 
           .findFirst() 
           .orElse(null); 

되세요위한 this 질문을 보면 추가 정보.

+0

난하지만 난 등호 (=)가, 걱정하지 마세요 –

+0

@AdnanAli을 사용하는 방법에 따라 어떤 것을 가지고 있다고 생각 결과는 몇 가지를 알고'equals'은'는, x.equals (Y) = Y로 정의된다. equals (x)'이므로 순서는 중요하지 않습니다. – beatngu13

2

equals()대칭 인 Java가 required이므로 두 코드 단편간에 차이가 없습니다.

두 스 니펫은 모두 숫자 인덱스로 반복하고 반환하기 전에 productList.get(i)을 두 번 검색한다는 점에서 차선책입니다. LinkedList<Product>을 전달하면 검색 속도가 상당히 느려지므로 인덱스별로 반복하는 것은 특히 위험합니다.

더 나은 방법을 사용하는 것입니다를위한 각 루프의 형태 :

당신이 제품 아이디의 그것이 정말 중요하지 않습니다 null이 결코 확신
for (Product p : productList) { 
    if (p.getId().equals(productId)) { 
     return p; 
    } 
} 
return null; 
0

.

하지만 그 대신

aString.equals("SomeString") 

"SomeString".equals(aString) 

을 사용하여 선호 예를 들면 있도록 "SomeString"를 알고 있기 때문에 일반적으로는, 방어 방법으로 프로그래밍하는 것이 좋은가 null 결코 없다.

또는 두 객체가 null이 될 수 있습니다 때

Objects.equals(object1, object2) 

사용합니다.

2

두 가지 구현에서 우려되는 점은 null 값에서 .equals를 호출 할 가능성이 있다는 것입니다.

둘 중 어느 것도 null이 아닌 것을 보장 할 수 있다면 동등한 것입니다.

Java 8을 사용하는 경우 스트림이 더 나은 선택 일 수 있습니다.

private Product getProduct(String productId,List<Product> productList){ 
    return products.stream() 
     .filter(p-> productId.equals(p.getId()) 
     .findFirst() 
     .orElse(null);