静态void排序方法不对Java中的传递集合进行排序

时间:2017-02-24 04:58:31

标签: java java-stream

我正在调用这样的方法:

display:inline

这是方法声明:

    final List<TimeCard> timeCards = new ArrayList<TimeCard>();
    ListFactory.populateLists(accounts, consultants, timeCards);
    ...
    TimeCardListUtil.sortByStartDate(timeCards);
    System.out.println("Time cards by date:");
    for (TimeCard tc : timeCards) {
        System.out.printf("  %s, %s%n", tc.getWeekStartingDay(), tc.getConsultant());
        }

方法声明中的println打印正确的顺序,但如果我从调用类打印列表,则顺序不变。

请帮忙。我无法找到解决方案,因为我可能不知道如何表达这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:2)

sorted()函数不会更改其操作的流。您需要使函数返回sorted()函数的结果。

答案 1 :(得分:2)

您已对流进行了排序,而不是传入的List<TimeCard>

timeCards方法中分配sortByStartDate变量。您将获得在方法之外反映的更改。

使用collet()来执行此操作。

public static void sortByStartDate(List<TimeCard> timeCards){
 timeCards = timeCards.stream()
            .sorted((e1, e2) -> e1.getWeekStartingDay().compareTo(e2.getWeekStartingDay())).collect(Collectors.toList());
}

另类清洁方式是:

timeCards.sort((e1, e2) -> e1.getWeekStartingDay().compareTo(e2.getWeekStartingDay()));

<强>更新

您可以在不传递lambda的情况下简化排序,但可以使用Comparator类获得方法引用的优势。

public static void sortByStartDate(List<TimeCard> timeCards){
     timeCards = timeCards.stream()
                .sort(Comparator.comparing(TimeCard::getWeekStartingDay)).collect(Collectors.toList());
    }