GVKun编程网logo

使用默认实现的null安全映射比较器

13

在本文中,我们将给您介绍关于使用默认实现的null安全映射比较器的详细内容,此外,我们还将为您提供关于AngularjsorderBy:如何从自定义排序函数调用默认比较器、c#–使用OrderBy扩展

在本文中,我们将给您介绍关于使用默认实现的null安全映射比较器的详细内容,此外,我们还将为您提供关于Angularjs orderBy:如何从自定义排序函数调用默认比较器、c# – 使用OrderBy扩展名时的默认比较器、c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value、c# – 我应该使用默认值(Foo),Foo.Empty还是null?的知识。

本文目录一览:

使用默认实现的null安全映射比较器

使用默认实现的null安全映射比较器

是否有内置的可能性在Java 8中创建空安全的映射比较器而无需编写自己的实现Comparator

运行以下代码时,它会导致NPE,因为的keyExtractor参数Comparator.comparing()可能返回null值:

public class ToSort{    private String sortBy;    public ToSort(String sortBy)    {        this.sortBy = sortBy;    }    public String getSortBy()    {        return sortBy;    }    public static void main(String[] args)    {        // mapping comparator        Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);                                  SortedSet<ToSort> set = new TreeSet<>(comp);        ToSort o1 = new ToSort("1");        ToSort o2 = new ToSort(null);        set.add(o1);        System.out.println(set.contains(o2)); //NPE because o2.getSortBy() == null    }}

java.util.Comparator.lambda $ comparing $ 77a9974f $
1(Comparator.java:469)处的线程“
main”中的java.lang.NullPointerException,java.util.Comparator $$ Lambda $ 2 /
1480010240.compare(未知源)处java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376)的java.util.Comparators
$
NullComparator.compare(Comparators.java:83)在java.util的java.util.TreeMap.getEntry(TreeMap.java:345)
.TreeMap.containsKey(TreeMap.java:232)在java.util.TreeSet.contains(TreeSet.java:234)在test.ToSort.main(ToSort.java:48)

使用

Comparator<ToSort> comp = Comparator.nullsFirst(Comparator.comparing(ToSort::getSortBy));

也不起作用,因为只有正确踩踏的ToSort对象null

我知道如何编写自己的Comparator实现,我只是在寻找更“优雅”的解决方案,例如

Comparator.comparingNullsFirst(ToSort::getSortBy)

答案1

小编典典

找到了可能的解决方案:

Comparator.comparing(ToSort::getSortBy,       Comparator.nullsFirst(Comparator.naturalOrder()))

Angularjs orderBy:如何从自定义排序函数调用默认比较器

Angularjs orderBy:如何从自定义排序函数调用默认比较器

我有一个自定义排序函数,用于将字符串转换为网格中一列的数字.其他列由字符串或日期值组成.我有一个自定义排序函数,它检查数字列并执行转换,但对于其他值,我想要默认比较器的行为.我该如何实现这一目标?

$scope.sort = function (keyname) {
  $scope.sortKey = keyname;
  $scope.reverse = !$scope.reverse;
};


$scope.sortSubGrid = function (a,b) {
  if ($scope.sortKey === 'caseNumber') {
    return = parseInt(b.value) -parseInt(a.value);
  }
  else {
    return = a.value > b.value;
  }
};
<tr dir-paginate="agreement in agreements|orderBy:sortKey:reverse:sortSubGrid" ...>

sortSubGrid函数的后半部分用于对非数字列进行排序,但未达到我期望的结果,这只是默认比较器提供的结果.如何获取第二个子句的默认行为?

解决方法

根据 orderBy.js中的代码,您可以使用默认值或自定义但不能同时使用两者,但这将是一个很好的功能.

// Define the `compare()` function. Use a default comparator if none is specified.
var compare = isFunction(compareFn) ? compareFn : defaultCompare;

因此,您始终可以获取原始defaultCompare代码并进行修改.

// source orderBy.js
function defaultCompare(v1,v2) {
  var result = 0;
  var type1 = v1.type;
  var type2 = v2.type;

  if (type1 === type2) {
    var value1 = v1.value;
    var value2 = v2.value;

    if (type1 === 'string') {
      // Compare strings case-insensitively
      value1 = value1.toLowerCase();
      value2 = value2.toLowerCase();
    } else if (type1 === 'object') {
      // For basic objects,use the position of the object
      // in the collection instead of the value
      if (isObject(value1)) value1 = v1.index;
      if (isObject(value2)) value2 = v2.index;
    }

    if (value1 !== value2) {
      result = value1 < value2 ? -1 : 1;
    }
  } else {
    result = type1 < type2 ? -1 : 1;
  }

  return result;
}

c# – 使用OrderBy扩展名时的默认比较器

c# – 使用OrderBy扩展名时的默认比较器

出于好奇:使用以下扩展方法对一堆对象进行排序时使用了什么比较器?

OrderBy(x=> x)

背景:我必须检查两个ISet< T>实例包含相同的元素并考虑使用

bool setsEqual = MySet.SequenceEqual(OtherSet);

方法.由于集合中包含的那些元素的顺序未定义且可能不同,因此在内部顺序不相同的情况下,SequenceEqual将失败.所以我必须明确定义一个订单.因为它本身的命令算法完全不相关,只要它稳定,我只使用了一个“Identity”lambda表达式:

bool setsEqual = MySet.OrderBy(x => x).SequenceEqual(OtherSet.OrderBy(x => x);

但是“比较对象本身”对代码意味着什么呢?由于这个OrderBy扩展方法是通用的,所以必须有一个默认的比较算法能够对对象进行排序而不需要了解更多关于它的东西,这意味着必须将排序的比较委托给集合的类型元素本身.是否存在元素类型必须支持的接口,或者是否存在默认比较器(可能是比较对象的内部存储器地址)?

解决方法

要回答排序问题:排序使用IComparable< T>如果没有实现,则为 IComperable. IComperable接口强制您实现int Compareto(对象)方法(如果使用了类型化版本,则使用int Compareto(T)方法).

元素的顺序由int的符号决定.返回的值解释如下:

> 0:两个对象是等价的(即相同)
> -1:比较对象在此对象之前(即在此对象之前)
> 1:比较对象跟随此对象(即在此对象之后)

忽略实际值,标志就是最重要的.如果您实现自己的IComparable接口,则必须选择排序顺序的语义.

许多对象已经实现了IComparable,就像你的所有数字,字符串等一样.如果你需要对你自己创建的对象进行排序,你需要明确地实现它.如果您打算将这些对象显示在屏幕上的列表中,那么这并不是一种不好的做法.

至于您的具体情况,您只需确定一个集合和另一个IEnumerable是否等效,那么您将使用在标准库集实现中实现的ISet<T>.SetEquals(IEnumerable<T>)方法.根据定义,设置只保证值是唯一的,因此只要元素的数量相同,您只需要检测一个IEnumerable中的所有元素都可以在集合中找到.

c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value

c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value

我有一个可以为空的DateTime变量.我想把它写到sql DB.当我尝试插入时:

如果变量有值,则没有问题.

但如果它没有值,则插入中断错误.

我想问:我们如何通过DbCommand参数将可空的DateTime插入sql?

(P.S.:sql列也可以为空.)

DateTime? myDate = null;
DbCommand dbCommand = new DbCommand();
dbCommand.Parameters.Add("NullablesqlDateField",DbType.DateTime,myDate);

解决方法

试试 null coalescing operator:

dbCommand.Parameters.Add("NullablesqlDateField",(object) myDate ?? dbnull.Value);

c# – 我应该使用默认值(Foo),Foo.Empty还是null?

c# – 我应该使用默认值(Foo),Foo.Empty还是null?

所以C#现在允许你使用默认(Foo)来获得一个已识别的“未填充”/空类的实例 – 我不确定它是否与新的Foo()完全相同.许多库类还实现了一个Foo.Empty属性,该属性返回一个类似的实例.当然,任何引用类型都可以指向null.那真的,有什么区别?什么时候是对还是错?什么更一致,或表现更好?在检查对象在概念上是否“未准备好黄金时间”时,我应该使用哪些测试?不是每个人都有Foo.IsNullOrEmpty().

解决方法

当Foo是类类型时,default(Foo)将返回null,其中Foo是值类型(例如int),并且Foo的实例将所有字段初始化为其各自的default()值,其中Foo是结构.它被添加到语言中,以便泛型可以支持值和引用类型 – 更多 info at MSDN

在SomeClass< T>的上下文中测试T时使用默认值(Foo)或MyMethod< T>并且您不知道T是值类型,类类型还是结构.

否则,null应表示“未知”,而空应表示“我知道这是空的”.如果你真的需要一个空的 – 但是非null – 你的类的实例,请使用Foo.Empty模式;例如String.Empty作为“”的替代,如果你需要将一些变量初始化为空字符串.

如果您知道自己正在使用引用类型(类),则使用null,不涉及泛型,并且您明确地测试未初始化的引用.

关于使用默认实现的null安全映射比较器的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Angularjs orderBy:如何从自定义排序函数调用默认比较器、c# – 使用OrderBy扩展名时的默认比较器、c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value、c# – 我应该使用默认值(Foo),Foo.Empty还是null?等相关知识的信息别忘了在本站进行查找喔。

本文标签: