gpt4 book ai didi

java - 如果使用自定义比较器创建,则为 SortedMap 生成的流的流特征可能无法排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:20 26 4
gpt4 key购买 nike

掌握 Lambda,作者:Maurice Naftalin,第 6 章 - 流性能。

解释了流在不同执行阶段(中间和终端)的不同特征。例如。

Stream.of(8,3,5,6,7,4)//ORDERED, SIZED
.filer(i->i%2==0) // ORDERED
.sorted() // ORDERED, SORTED
.distinct() // DISTINCT, ORDERED, SORTED
.map(i->i+1) // ORDERED
.unordered(); //none

令我困惑的是对 SORTED 特征的解释:

“如果已定义比较器并将其用于此目的,则流元素可能已按其他顺序排序,但此类流不具有 SORTED 特征。”

为什么如果为排序数据结构(在上述情况下为 SortedMap)的实现提供自定义比较器,框架将不会考虑创建具有排序特征的流?

最佳答案

Flown 的评论绝对正确。 SORTED 仅针对自然顺序进行报告,这在之前已被争论过。首先,这甚至在内部用作标志,称为:isNaturalSort:

/**
* Sort using natural order of {@literal <T>} which must be
* {@code Comparable}.
*/
OfRef(AbstractPipeline<?, T, ?> upstream) {
super(upstream, StreamShape.REFERENCE,
StreamOpFlag.IS_ORDERED | StreamOpFlag.IS_SORTED);
this.isNaturalSort = true;

当通过 sorted(CustomComparator) 使用时,相同的标志 isNaturalSort 设置为 false

这是一个内部细节,jdk 开发人员似乎没有发现这样实现它有用 - 可能与它无关可能真正有用。但这可能会改变......

这里至少还有一个缺陷。想象这样一个类:

static class User implements Comparable<User> {
private final int id;

public User(int id) {
super();
this.id = id;
}

public int getId() {
return id;
}

@Override
public int compareTo(User usr) {
return 42; // don't do this
}

}

还有一些流操作:

Stream<User> byId = Stream.of(new User(12), new User(10))
.sorted(Comparator.comparing(User::getId));

System.out.println(byId.spliterator().hasCharacteristics(Spliterator.SORTED));

Stream<User> natural = Stream.of(new User(12), new User(10))
.sorted(Comparator.naturalOrder());

System.out.println(natural.spliterator().hasCharacteristics(Spliterator.SORTED));

Stream<User> plain = Stream.of(new User(12), new User(10)).sorted();
System.out.println(plain.spliterator().hasCharacteristics(Spliterator.SORTED));

前两个报告false,但最后一个报告true;这至少很奇怪。

关于java - 如果使用自定义比较器创建,则为 SortedMap 生成的流的流特征可能无法排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com