【问题标题】:Sorted() in lambda's not working as intended - Java 8 [duplicate]lambda 中的 Sorted() 未按预期工作 - Java 8 [重复]
【发布时间】:2019-12-03 05:56:30
【问题描述】:

在学习 lambda 时,我发现 sorted 方法没有按预期工作。

以下程序将[1, 33, 2, 4, 5, 11] 作为输出,但我希望得到排序后的输出。

奇怪的是,当我将 [33, 2, 1, 4, 5, 11] 替换为 [ 3, 1,2, 4, 5] 时,一切正常,并且我得到了预期的排序输出。

public class Test {
            public static void main(String[] args) {
            List<Integer> list = Arrays.asList(33, 2, 1, 4, 5, 11);
            Set<Integer> set = list.stream().sorted().collect(Collectors.toSet());
            System.out.println(set);
        }
      }

请帮助我理解这种行为。

【问题讨论】:

    标签: java sorting lambda java-8


    【解决方案1】:

    您应该收集到Collection,它保留了HashSet 在toSet 的默认实现中所没有的顺序:

    .collect(Collectors.toCollection(LinkedHashSet::new))
    

    【讨论】:

    • 但是为什么它适用于 3, 1,2, 4, 5
    • '因为...运气。或者更准确地说,一种确定性但偶然的排序,由计算 Integer:hashCode 的方式 + 填充(默认)HashSet 的方式确定。
    • @Joker 这可能只是一个巧合,正如斯蒂芬指出整数的哈希码实现所指出的那样。对于一个这样的实验,您可以使用输入 3, 1,2, 4, 5 删除 sorted 操作,并验证输出是否与使用 sorted 操作时发现的相同。
    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2018-08-26
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多