在本文中,我们将给您介绍关于使用默认实现的null安全映射比较器的详细内容,此外,我们还将为您提供关于AngularjsorderBy:如何从自定义排序函数调用默认比较器、c#–使用OrderBy扩展
在本文中,我们将给您介绍关于使用默认实现的null安全映射比较器的详细内容,此外,我们还将为您提供关于Angularjs orderBy:如何从自定义排序函数调用默认比较器、c# – 使用OrderBy扩展名时的默认比较器、c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value、c# – 我应该使用默认值(Foo),Foo.Empty还是null?的知识。
本文目录一览:- 使用默认实现的null安全映射比较器
- Angularjs orderBy:如何从自定义排序函数调用默认比较器
- c# – 使用OrderBy扩展名时的默认比较器
- c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value
- c# – 我应该使用默认值(Foo),Foo.Empty还是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:如何从自定义排序函数调用默认比较器
$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函数的后半部分用于对非数字列进行排序,但未达到我期望的结果,这只是默认比较器提供的结果.如何获取第二个子句的默认行为?
解决方法
// 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扩展名时的默认比较器
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扩展方法是通用的,所以必须有一个默认的比较算法能够对对象进行排序而不需要了解更多关于它的东西,这意味着必须将排序的比较委托给集合的类型元素本身.是否存在元素类型必须支持的接口,或者是否存在默认比较器(可能是比较对象的内部存储器地址)?
解决方法
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
如果变量有值,则没有问题.
但如果它没有值,则插入中断错误.
我想问:我们如何通过DbCommand参数将可空的DateTime插入sql?
(P.S.:sql列也可以为空.)
DateTime? myDate = null; DbCommand dbCommand = new DbCommand(); dbCommand.Parameters.Add("NullablesqlDateField",DbType.DateTime,myDate);
解决方法
dbCommand.Parameters.Add("NullablesqlDateField",(object) myDate ?? dbnull.Value);
c# – 我应该使用默认值(Foo),Foo.Empty还是null?
解决方法
在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?等相关知识的信息别忘了在本站进行查找喔。
本文标签: