Collections.sort() 在嵌套的 属性 值上

Collections.sort() on nested property values

我正在研究数据的排序功能 table。我有 JSF Web 控制器:

@Named
@ViewScoped
public class SearchPlayerController implements Serializable {

    private List<Player> playerList;

    @EJB
    PlayerFacade playerFacade;

    @PostConstruct
    public void init() {
        if (playerList == null) {
            playerList = playerFacade.findAll();
        }
    }

    // getters and setters
    *
    *
    *
}

在这个控制器中我有一个排序方法:

public String sortDataByClubName(final String dir) {
    Collections.sort(playerList, (Player a, Player b) -> {
        if(a.getClubId().getClubName()
            .equals(b.getClubId().getClubName())) {
            return 0;
        } else if(a.getClubId().getClubName() == null) {
            return -1;
        } else if(b.getClubId().getClubName() == null) {
            return 1;
        } else {
            if(dir.equals("asc")) {
                return a.getClubId().getClubName()
                    .compareTo(b.getClubId().getClubName());
            } else {
                return b.getClubId().getClubName()
                    .compareTo(a.getClubId().getClubName());
            }
        }
    });
    return null;
}

在页面视图上调用排序后,抛出 NullPointerException。我认为主要原因是在 Comparator 内部它无法读取在获取 Club 对象后应该可以访问的 clubName 的值。是否有可能比较嵌套属性的值?

您似乎只在 Player.getClubId().getClubName() 上排序。似乎应该检查 getClubId()getClubName() 是否为空。我会这样做:

public class PlayerComparator implements Comparator<Player> {
    private String dir; // Populate with constructor
    public int compare(Player a, Player b) {
        int result = nullCheck(a.getClubId(), b.getClubId());
        if(result != 0) {
            return result;
        }
        String aname = a.getClubId().getClubName();
        String bname = b.getClubId().getClubName();
        result = nullCheck(aname, bname);
        if(result != 0) {
            return result;
        }
        result = aname.compareTo(bname);
        if("asc".equals(dir)) {   // No NPE thrown if `dir` is null
            result = -1 * result;
        }
        return result;
    }

    private int nullCheck(Object a, Object b) {
        if(a == null) { return -1; }
        if(b == null) { return 1; }
        return 0;
    }
}