【发布时间】:2021-10-01 11:32:58
【问题描述】:
我有这个命令:
list.stream()
.filter(e -> ...)
.sorted(comparatorShuffle())
.findAny()
.orElse(null);
这是comparatorShuffle():
public static <E> Comparator<E> comparatorShuffle(){
return new Comparator<>(){
private final List<Integer> temp = List.of(-1, 1);
private final Random random = new Random();
@Override
@SuppressWarnings("ComparatorMethodParameterNotUsed")
public int compare(E o1, E o2){
return temp.get(random.nextInt(temp.size()));
}
};
}
有时我会遇到异常:IllegalArgumentException: Comparison method violates its general contract!
我明白我为什么会得到这个,这是因为排序(它是随机的)不遵守规则:if A > B && B > C then A > C
有办法抑制/忽略此错误吗?或者不使用collect 的另一种方式来随机播放流?
【问题讨论】:
-
您的比较器不是合适的比较器。它违反了比较器协议。首先,这也不是一种随机采样或随机播放的明智方式。
-
@kaya3 “它违反了比较器协议” OP 知道这一点(“我明白我为什么得到这个”)。
标签: java java-stream