当前位置: 首页 > 知识库问答 >
问题:

使用Lambdas的比较器

任绪
2023-03-14

我有一个比较器,它检查字符串是否为空,并返回-1。如果它们不是null,则进行比较。我想用lambda函数实现这个。

以下是代码:

private SortedSet<Student> studentSet() {
  return new TreeSet<>(new Comparator<Student>() {
   @Override
   public int compare(Student s1, Student s2) {
     if(s1.getName() == null) {
       return -1;
     }
     if(s2.getName() == null) {
       return 1;
     }
     return s1.getName().compareToIgnoreCase(s2.getName());
    }
   });
 }

我知道如何使用lambdas返回一个简单的比较器。我对如何实现上述代码感到困惑。

共有1个答案

饶元章
2023-03-14

有几种方法可以做到这一点。将代码直译为lambda是

Comparator<Student> cmp = (s1, s2) -> {
  if (s1.getName() == null) {
    return -1;
  }
  if (s2.getName() == null) {
    return 1;
  }

  return s1.getName().compareToIgnoreCase(s2.getName());
};

一行等效(使用比较器::comparing比较器::nullsFirst)是

Comparator<Student> cmp = Comparator.comparing(Student::getName,
      Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER));
 类似资料:
  • 假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有办法检查它们以便进行比较? 我最感兴趣的代码是 完整的代码是 看来唯一的解决方案是将每个lambda定义为一个字段,并仅使用这些字段。如果要打印调用的方法,最好使用。使用lambda表达式有更好的方法吗? 此外,是否可以打印一个lambda并获得一些人类可读的内容?如果您打印而不是 得到类似于 甚至可以使用和方法。

  • 我用示例值编写了简单的<code>列表,但事实证明,我也可以传递<code>Integer::max 此外,程序打印出奇怪的结果,我检查了它的“内部”,它看起来没问题,但在我得到最终结果后-它们不准确。 例子: 输出: 我的问题是: 为什么我可以传递来代替 为什么我的函数返回5作为结果,而在内部它是8

  • 日安- 我正在处理一个任务,在该任务中,我有指令来创建一个名为的方法,该方法将执行以下任务: public int compare(Object first,Object second)(请注意,您还可以定义:public int compare(Attory first,Attory second),方法是让类 为此,我创建了一个类,如下所示: AthletenameComparator

  • 我正在我的类Employee中实现Comparator和Comparable来排序ArrayList。我在2个参数名称和ID排序。当使用collections.sort(Employee ob1,Employee ob2)进行ID排序时,它不起作用。我得到一个编译错误,即类没有声明为弃权,也没有重写compare(),尽管我是这样做的: 如果我使用 我的疑问是,既然员工也是一个对象,为什么早先的不

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和