【问题标题】:Java 8 Stream sorting List of String [duplicate]Java 8 Stream排序字符串列表[重复]
【发布时间】:2017-02-18 10:23:31
【问题描述】:

我在流上调用 sorted 方法。 Java 文档说:

“Sorted 方法返回一个由该流的元素组成的流,按照自然顺序排序。”

但是当我运行下面的代码时:

List<String> list = new ArrayList<String>();
list.add("b");
list.add("a");
list.add("z");
list.add("p");
list.stream().sorted();
System.out.println(list);

我得到的输出为

[b, a, z, p]

为什么我没有得到自然排序的输出?

【问题讨论】:

  • sorted() 返回一个元素已排序的流,它不会对您当前的流进行排序。
  • @Snickers3192:您的意思是“它不会对List 进行排序”,因为没有“当前流”。 OP 表明,命名错误会导致混乱。
  • @Holger 对不起,用列表替换流。

标签: java sorting java-8 java-stream


【解决方案1】:

改变这个

list.stream().sorted();
System.out.println(list);

类似

list.stream().sorted().forEachOrdered(System.out::println);

您的方法是 println list (不是排序的流)。或者(或另外),您可以缩短初始化程序并重新收集 List 之类的

List<String> list = new ArrayList<>(Arrays.asList("b","a","z","p"));
list = list.stream().sorted().collect(Collectors.toList());
System.out.println(list);

哪些输出(如您所料)

[a, b, p, z]

【讨论】:

  • 我想你的意思是forEachOrdered,而不是forEach
  • 没有理由将Arrays.asList的结果复制到ArrayList;方法Arrays.asList 返回一个List。在任何一种情况下,列表都是可变的,不需要像list = list.stream().sorted().collect(Collectors.toList()); 这样的流绕道,一个简单的list.sort(null); 将就地对列表进行排序。
【解决方案2】:

您应该收集排序的结果,然后将其分配给您的列表。

    List<String> list = new ArrayList<String>();
    list.add("b");
    list.add("a");
    list.add("z");
    list.add("p");
    list = list.stream().sorted().collect(Collectors.toList());
    System.out.println(list);

【讨论】:

    【解决方案3】:

    如果你想要你的排序列表。

    让我们改变这个

    list.stream().sorted();
    

    list.sort((e1, e2) -> e1.compareTo(e2));
    

    希望对您有所帮助!

    【讨论】:

    • 不幸的是,这不是一个可以接受的答案。因为,OP的方式确实是正确的。您无需传递自定义比较器即可获得给定字符串对象流的自然顺序。顺便提一句;以上2个答案将指出出了什么问题。希望你能从中学到一些东西:)
    • @Jude:你知道打电话给list.stream().sorted()和打电话给list.sort(…)的区别吗?自定义比较器可能已经过时,但这个答案是正确的。
    • @Holger 嗨,第一个只会按自然顺序对元素进行排序。 (使用 compareTo 或 obj.toString().compareTo() 实现)。哦,伙计……这是从 Java 8 添加到 List 接口的新默认方法。对不起这是我的错。但是,这个答案并没有指出除非有终端操作,否则中间操作不会触发。
    • @Jude:即使使用终端操作,流操作也不会修改源列表。是的,这个答案缺乏解释,但提供了一个直接的解决方案。不过,我更喜欢list.sort(null)list.sort(Comparator.naturalOrder())...
    • @Holger 是的。 Comparator.naturalOrder() 是重点。
    【解决方案4】:

    您的流没有终端运算符,因此不会被处理。终端操作符包括但不限于:forEach、toArray、reduce、collect。您的代码段应类似于

    list.stream().sorted().forEachOrdered(System.out::println);
    

    【讨论】:

    • 我想你的意思是forEachOrdered,而不是forEach
    • @LouisWasserman 啊,是的,谢谢。我会确保编辑它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2014-10-04
    • 2021-01-29
    • 2022-01-12
    • 2019-10-29
    相关资源
    最近更新 更多