感谢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>)
答案 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());