在lambda中使用comparable处理Java8集合排序方法中的空检查

8qgya5xd  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(378)

我有一份清单 Member 需要在java 8 collection.sort方法中为 Person 如果我有空值,请使用firstname。目前我有 Member 哪个实现 Comparable 接口以便 compareTo 其他成员的全名。我从timsort binarysort中得到一个nullpointerexception。似乎这是openjdk中的一个bug。找到了此问题中nullpointerexception的解决方案。以上问题中的任何建议解决方案,以及我在下面提到的内容。
主程序

  1. import java.util.Collections;
  2. import java.util.List;
  3. public class SortMembersByFirstName {
  4. public static void main(String[] args) {
  5. List<Member> members = getMembers();
  6. List<Member> sorted = setMemberCacheOrderByFirstName(members);
  7. for (Member mem: sorted) {
  8. System.out.println(mem.toString());
  9. }
  10. }
  11. private static List<Member> getMembers() {
  12. Person tim = new Person("Tim", "Southee");
  13. Member member1 = new Member(tim);
  14. Person eoin = new Person("Eoin", "Morgan");
  15. Member member2 = new Member(eoin);
  16. Person moeenAli = new Person("Moeen", "Ali");
  17. Member member3 = new Member(moeenAli);
  18. Person timFirstNameNull = new Person(null, "Tim");
  19. Member member4 = new Member(timFirstNameNull);
  20. Person timFirstNameLastNameNull = new Person(null, null);
  21. Member member5 = new Member(timFirstNameLastNameNull);
  22. Person nullPerson = null;
  23. Member member6 = new Member(nullPerson);
  24. List<Member> members = new ArrayList<>();
  25. members.add(member1);
  26. members.add(member2);
  27. members.add(member3);
  28. members.add(member4);
  29. members.add(member5);
  30. members.add(member6);
  31. return members;
  32. }
  33. /**
  34. * Order list members by first name
  35. */
  36. private static List<Member> setMemberCacheOrderByFirstName(List<Member> members) {
  37. // TimSort.binarySort NPE
  38. Collections.sort(members, (m1, m2) ->
  39. m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName())
  40. );
  41. return members;
  42. }
  43. }

成员类

  1. class Member implements Comparable<Member>{
  2. private Person person;
  3. public Member(Person person){
  4. this.person = person;
  5. }
  6. public Person getPerson(){
  7. return this.person;
  8. }
  9. public void setPerson(Person person){
  10. this.person = person;
  11. }
  12. public String getFullName(){
  13. return this.getPerson() != null ? this.getPerson().getFirstName() + " " + this.getPerson().getLastName() : "";
  14. }
  15. public int compareTo(Member o) {
  16. return this.getFullName().compareTo(o.getFullName());
  17. }
  18. @Override
  19. public String toString() {
  20. return "Member{" +
  21. "person=" + person +
  22. '}';
  23. }
  24. }

人类

  1. class Person{
  2. private String firstName;
  3. private String lastName;
  4. public String getFirstName(){
  5. return this.firstName;
  6. }
  7. public String getLastName(){
  8. return this.firstName;
  9. }
  10. public void setFirstName(String firstName){
  11. this.firstName = firstName;
  12. }
  13. @Override
  14. public String toString() {
  15. return "Person{" +
  16. "firstName='" + firstName + '\'' +
  17. ", lastName='" + lastName + '\'' +
  18. '}';
  19. }
  20. public Person(String firstname, String lastname){
  21. this.firstName = firstname;
  22. this.lastName= lastname;
  23. }
  24. }

一种解决方案是捕获抛出的nullpointerexeceptions。这样地

  1. private static List<Member> setMemberCacheOrderByFirstName(List<Member> members) {
  2. Collections.sort(members, (m1, m2) -> {
  3. try {
  4. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  5. }catch (NullPointerException e){
  6. return 0;
  7. }
  8. });
  9. return members;
  10. }

或者手动检查是否存在不太好的空值。

  1. private static List<Member> setMemberCacheOrderByFirstName(List<Member> members) {
  2. Collections.sort(members, (m1, m2) -> {
  3. // sort the list for firstnames
  4. if (m1.getPerson() != null && m2.getPerson() != null && m1.getPerson().getFirstName() != null
  5. && m2.getPerson().getFirstName() != null) {
  6. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  7. } else {
  8. // Assuming any firstname is null
  9. if (m1.getPerson().getFirstName() == null || m2.getPerson().getFirstName() == null
  10. && (m1.getPerson() != null && m2.getPerson() != null)) {
  11. if (m1.getPerson().getFirstName() == null) {
  12. m1.getPerson().setFirstName("");
  13. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  14. }
  15. m2.getPerson().setFirstName("");
  16. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  17. }
  18. // Assuming any member or person is null from schedulers
  19. return "".compareTo("");
  20. }
  21. });
  22. return members;
  23. }
vulvrdjw

vulvrdjw1#

使用 Comparator.nullsFirstComparator.nullsLast 这将是正确的选择。
如果您需要在 first . 你可以用这个

  1. Collections.sort(members, (m1, m2) -> {
  2. if(m1.getPerson() == null || m2.getPerson() == null ||
  3. m1.getPerson().getFirstName() == null || m2.getPerson().getFirstName() == null){
  4. return -1;
  5. }
  6. if(m1.getPerson() != null && m2.getPerson() != null &&
  7. m1.getPerson().getFirstName() != null && m2.getPerson().getFirstName() != null){
  8. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  9. }
  10. return 0;
  11. });

如果您需要在 last . 你可以用这个

  1. Collections.sort(members, (m1, m2) -> {
  2. if(m1.getPerson() == null && m2.getPerson() == null &&
  3. m1.getPerson().getFirstName() == null && m2.getPerson().getFirstName() == null){
  4. return -1;
  5. }
  6. if(m1.getPerson() != null && m2.getPerson() != null &&
  7. m1.getPerson().getFirstName() != null && m2.getPerson().getFirstName() != null){
  8. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  9. }
  10. return 0;
  11. });

优化的方法是。

  1. Collections.sort(members, (m1, m2) -> {
  2. if (m1.getPerson() == null || m2.getPerson() == null ||
  3. m1.getPerson().getFirstName() == null ||
  4. m2.getPerson().getFirstName() == null) {
  5. return -1;
  6. } else {
  7. return m1.getPerson().getFirstName().compareTo(m2.getPerson().getFirstName());
  8. }
  9. });
展开查看全部

相关问题