Java-8:如何使用Map.Entry#comparisonByValue对Map进行排序(基于值)而忽略区分大小写?

Nee*_*ain 5 java string case-insensitive java-8 java-stream

我想按字母顺序对值进行排序,忽略区分大小写并返回键列表.

 /**
   * This method will sort allCostPlanDetailsRows based on Value in <Key,Value> pair
   *
   * @param sortingOrder_ whether to sort the LinkedHashMap in Ascending order or Descending order
   * @return List<String> returns List of costPlanDetailsRowId in sorted order
   */
  private List<String> sortCostPlanDetailRows( SortingOrder sortingOrder_ )
  {
    return _allCostPlanDetailRows
      .entrySet()
      .stream()
      .sorted( sortingOrder_ == SortingOrder.DESC ? Map.Entry.<String, String>comparingByValue(Comparator.nullsFirst(Comparator.naturalOrder())).reversed() : Map.Entry.comparingByValue(Comparator.nullsFirst(
          Comparator.naturalOrder())) )
      .map( Map.Entry::getKey )
      .collect( Collectors.toList() );
  }
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

注意:如果我可以改进上面的代码,欢迎提出建议.

Mur*_*nik 7

naturalOrder您可以使用String.CASE_INSENSITIVE_ORDER以下代码而不是使用比较器:

return _allCostPlanDetailRows
      .entrySet()
      .stream()
      .sorted( sortingOrder_ == SortingOrder.DESC ? Map.Entry.<String, String>comparingByValue(Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)).reversed() : Map.Entry.comparingByValue(Comparator.nullsFirst(
          String.CASE_INSENSITIVE_ORDER)) )
      .map( Map.Entry::getKey )
      .collect( Collectors.toList() );
Run Code Online (Sandbox Code Playgroud)