排序MyType列表的列表

时间:2015-11-27 21:53:44

标签: lambda java-8 java-stream

感谢eran,我有以下Lambda,它创建了myType列表的列表。 MyType包含名为dateOfContainer的字段。 我现在的问题是,是否有可能扩展表达式,以便按List<MyType>List<List<MyType>> dateOfContainer列表进行排序?

List<List<MyType>> list = new ArrayList<> (
myList.stream().collect (Collectors.groupingBy(MyType::getDateOfContainer)).values());

[编辑]

非常感谢您的建议。我仍然在和女巫这个表达斗争。我目前的表达方式如下:

List<List<ScheduleIntervalContainer>> list = new ArrayList<>(
             structuredScheduleIntervalContainers.stream().sorted(Comparator.comparing(ScheduleIntervalContainer::getDateOfContainer))
            .collect(Collectors.groupingBy(ScheduleIntervalContainer::getDateOfContainer, LinkedHashMap::new, Collectors.toList())).values());

但是我在eclipse中收到了这个错误:

  

sorted(Comparator<? super List<ScheduleIntervalContainer>>)类型中的方法Stream<List<ScheduleIntervalContainer>>不适用于参数(Comparator<ScheduleIntervalContainer>)

2 个答案:

答案 0 :(得分:1)

Stream具有对元素进行排序的排序方法。看一下下面的例子:

Stream.of(1,2,4,0,3).sorted().forEach(i -> System.out.println(i));

这将打印

0
1
2
3
4

但在你的情况下,你可能必须实现自己的比较方法来对元素进行排序。看一下我从http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/

获取的以下示例
Stream.of("d2", "a2", "b1", "b3", "c")
      .sorted((s1, s2) -> {
          System.out.printf("sort: %s; %s\n", s1, s2);
          return s1.compareTo(s2);
      })
      .filter(s -> {
          System.out.println("filter: " + s);
          return s.startsWith("a");
      })
      .map(s -> {
          System.out.println("map: " + s);
          return s.toUpperCase();
      })
      .forEach(s -> System.out.println("forEach: " + s));

答案 1 :(得分:1)

您可以在分组之前对流进行排序,然后使用保留顺序的LinkedHashMap

List<List<MyType>> list = new ArrayList<> (
    myList.stream()
          .sorted(Comparator.comparing(MyType::getDateOfContainer))
          .collect(
              Collectors.groupingBy(MyType::getDateOfContainer,
                  LinkedHashMap::new,
                  Collectors.toList()))
          .values());