Java Comparator.nullsLast和Comparator.nullsFirst不按预期工作。

huangapple go评论120阅读模式
英文:

Java Comparator.nullsLast and Comparator.nullsFirst not working as expected

问题

以下是您提供的内容的中文翻译:

我有以下方法,在尝试按列表中为null的字段进行排序时,在sort()中抛出NPE:

  1. private List<MobileSearch> sortAscAndDesc(final MobilesPostResponse mobilesPostResponse,
  2. final String[] split,
  3. final Comparator<MobileSearch> comparing) {
  4. final var direction = getDirection(split);
  5. final var modifiableList = new ArrayList<MobileSearch>(mobilesPostResponse.getMobiles());
  6. final var comparator = direction.equals(Constants.ASC)
  7. ? comparing.thenComparing(Comparator.nullsLast(comparing))
  8. : comparing.thenComparing(Comparator.nullsFirst(comparing.reversed()));
  9. modifiableList.sort(comparator);
  10. return modifiableList;
  11. }

作为参数传递了一个比较器,该比较器使用了几个keyExtractors。

您可以在下面看到一些方法调用:

  1. final var sortedList = sortAscAndDesc(mobilesPostResponse, split, Comparator.comparing(MobileSearch::getMsisdn));
  2. final var sortedList = sortAscAndDesc(mobilesPostResponse, split, Comparator.comparing(MobileSearch::getAssignedProfile));

我想要的只是在每种情况下应用modifiableList.sort()时避免获取NPE,但是使用我的代码片段无法实现。有什么想法?

英文:

I have the following method, which throws NPE in sort() when I am trying to sort by a field which is null in the list :

  1. private List&lt;MobileSearch&gt; sortAscAndDesc(final MobilesPostResponse mobilesPostResponse,
  2. final String[] split,
  3. final Comparator&lt;MobileSearch&gt; comparing) {
  4. final var direction = getDirection(split);
  5. final var modifiableList = new ArrayList&lt;MobileSearch&gt;(mobilesPostResponse.getMobiles());
  6. final var comparator = direction.equals(Constants.ASC)
  7. ? comparing.thenComparing(Comparator.nullsLast(comparing))
  8. : comparing.thenComparing(Comparator.nullsFirst(comparing.reversed()));
  9. modifiableList.sort(comparator);
  10. return modifiableList;
  11. }

A comparator is passed as a parameter which is using several keyExtractors.
You can see below some method calls :

  1. final var sortedList = sortAscAndDesc(mobilesPostResponse, split, Comparator.comparing(MobileSearch::getMsisdn));
  2. final var sortedList = sortAscAndDesc(mobilesPostResponse, split, Comparator.comparing(MobileSearch::getAssignedProfile));

All I want is to avoid getting NPE when applying the modifiableList.sort() in EVERY case, but with my piece of code I can not achieve it. Any ideas?

答案1

得分: 2

您正在使用comparing.thenComparing(...)对空值进行比较,然后才使用Comparators.nulls...(..)。您只需要使用Comparator.nulls...(..),如下所示:

  1. private List<MobileSearch> sortAscAndDesc(final MobilesPostResponse mobilesPostResponse,
  2. final String[] split,
  3. final Comparator<MobileSearch> comparing) {
  4. final var direction = getDirection(split);
  5. final var modifiableList = new ArrayList<MobileSearch>(mobilesPostResponse.getMobiles());
  6. final var comparator = direction.equals(Constants.ASC)
  7. ? Comparator.nullsLast(comparing)
  8. : Comparator.nullsFirst(comparing.reversed());
  9. modifiableList.sort(comparator);
  10. return modifiableList;
  11. }
英文:

You are using the comparing comparator on the null values by using comparing.thenComparing(...) and then only you use the Comparators.nulls...(..). You just need the Comparator.nulls...(..) like this :

  1. private List&lt;MobileSearch&gt; sortAscAndDesc(final MobilesPostResponse mobilesPostResponse,
  2. final String[] split,
  3. final Comparator&lt;MobileSearch&gt; comparing) {
  4. final var direction = getDirection(split);
  5. final var modifiableList = new ArrayList&lt;MobileSearch&gt;(mobilesPostResponse.getMobiles());
  6. final var comparator = direction.equals(Constants.ASC)
  7. ? Comparator.nullsLast(comparing)
  8. : Comparator.nullsFirst(comparing.reversed());
  9. modifiableList.sort(comparator);
  10. return modifiableList;
  11. }

huangapple
  • 本文由 发表于 2023年5月29日 19:28:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76356942.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定