này có thể là một câu hỏi đơn giản nhưng tôi muốn hiểu nó rõ ràng ...Java 8 sánh nullsFirst naturalOrder nhầm lẫn
Tôi có một mã như thế này:
public final class Persona
{
private final int id;
private final String name
public Persona(final int id,final String name)
{
this.id = id;
this.name = name;
}
public int getId(){return id;}
public String getName(){return name;}
@Override
public String toString(){return "Persona{" + "id=" + id + ", name=" + name+'}';}
}
Và tôi đang thử nghiệm mã này :
import static java.util.Comparator.*;
private void nullsFirstTesting()
{
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
final List<Persona>persons = Arrays.asList(new Persona(1,"Cristian"),new Persona(2,"Guadalupe"),new Persona(3,"Cristina"),new Persona(4,"Chinga"),new Persona(5,null));
persons
.stream()
.sorted(comparator)
.forEach(System.out::println);
}
Điều này cho thấy kết quả như sau:
Persona{id=5, name=null}
Persona{id=4, name=Chinga}
Persona{id=1, name=Cristian}
Persona{id=3, name=Cristina}
Persona{id=2, name=Guadalupe}
Những kết quả này phù hợp với tôi nhưng tôi đã hiểu được vấn đề.
Khi tôi bỏ qua các đối tượng new Persona(5,null)
và tôi vượt qua so sánh:
final Comparator<Persona>comparator = comparing(Persona::getName);
Nó hoạt động như một nét duyên dáng. Phân loại của tôi là theo số natural order of name property
. Vấn đề phát sinh khi tôi thêm đối tượng với name=null
, tôi chỉ nghĩ rằng tôi sẽ cần so sánh của tôi như thế này.
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst());
suy nghĩ của tôi là sai lầm : "OK, khi tên là phi null, họ đều được sắp xếp trong natural order of name
, giống như so sánh trước, và nếu họ có null
họ sẽ là người đầu tiên nhưng không của tôi tên rỗng sẽ vẫn được sắp xếp theo thứ tự tự nhiên ".
Nhưng mã đúng là thế này:
final Comparator<Persona>comparator = comparing(Persona::getName,nullsFirst(naturalOrder()));
Tôi không hiểu các tham số để nullsFirst
. Tôi chỉ nghĩ rằng natural order of name
sẽ rõ ràng [mặc định] thậm chí xử lý các giá trị null
.
Nhưng các tài liệu nói:
Trả về một so sánh null-thân thiện mà coi
null
là ít so với người không null. Khi cả hai đều lànull
, chúng được coi là bằng nhau. Nếu cả hai đều không có giá trị rỗng, sốComparator
được chỉ định được sử dụng để xác định thứ tự. Nếu so sánh được chỉ định lànull
, thì trình so sánh được trả về xem xét tất cả các giá trị không null phải bằng nhau.
Dòng này: "Nếu cả hai đều không rỗng, chỉ định Comparator
được chỉ định để xác định thứ tự".
Tôi bối rối khi nào và như thế nào thứ tự tự nhiên nên được đặt rõ ràng hoặc khi chúng được suy ra.
Lưu ý * "Nếu so sánh quy định là 'null', sau đó bộ so sánh trả về xem xét tất cả các giá trị không null bằng nhau." * Nói cách khác, bạn có thể làm 'nullsFirst (null)'; tuy nhiên nó chỉ đơn thuần là sắp xếp các giá trị rỗng vào mặt trước mà không phân loại các giá trị không rỗng. Tài liệu thực sự giải thích nó khá tốt. – Radiodef
@chiperotiz vì vậy bạn đã giải quyết nó như thế nào? Bạn có thể sắp xếp theo null trước và sau đó là Thứ tự tự nhiên? – Unheilig
có sử dụng mã này 'cuối cùng so sánh so sánh = so sánh (Persona :: getName, nullsFirst (naturalOrder())); ' –
chiperortiz