並べ替えとグループ化する必要のあるオブジェクトのリストを考えます:
static class Widget {
// ...
public String getCode() { return widgetCode; }
public String getName() { return widgetName; }
}
List<Widget> widgetList = Arrays.asList(
// several widgets with codes and names
);
私は、リストの一覧表示、によってグループ化にグループにリストをしたいwidgetCode、それらが元のリストに遭遇した順序で各サブリストの要素を持ちます。私は、私が使用してリストの地図にまとめることができていることを知っているgroupingBy
コレクターを:
Map<String,List<Widget>> widgetMap = widgetList.stream()
.collect(groupingBy(Widget::getCode));
当然私はキーがソートされていることを取ることはありませんので、私はSortedMapの型に全部をロードする余分な一歩を踏み出しました:
SortedMap<String,List<Widget>> sortedWidgetMap = new TreeMap<String,List<Widget>>(
widgetList.stream()
.collect(groupingBy(Widget::getCode))
);
私はからのコレクションを取得することができます知っているsortedWidgetMapを .values()を使用して、私はそれが注文したマップタイプから来ているので、それは私の現在のソリューションですので、それは、順序付きコレクションであると思います。
Collection<List<Widget>> widgetListList = new TreeMap<String,List<Widget>>(
widgetList.stream()
.collect(groupingBy(Widget::getCode))
).values();
widgetListList.forEach(System.out::println); // do something with the data
これは、これまでに動作しますが、私は結果widgetListListが実際に正しい順序(すなわちによってであることが保証されていることを確信していないよwidgetCode)またはサブリストは、それらが元のリストで発見されたために建設されること。また、私は私が欲しいの出力を達成するために、単独でストリームAPIを使用することが可能でなければならないと思います。だから、どのように私はこれは、より良い行うことができますか?
参照して、コメントで述べたように非常に似ている問題(実際には、私はほとんどそれが重複であると考えられて...)、groupBy
コールは異なるフレーバーがあるが、その一つは、マップのために工場に渡すことができますそれが作成されます。
だから、明示的に「シンプル」の結果ラップする必要はありませんgroupBy
新しいの創造への呼び出しをTreeMap
作成できるので、TreeMap
直接は。このマップ(およびそのvalues()
コレクションが!)キーによって順序付けされます。マップの値は、下流のコレクタを使用して作成されているリスト、あるtoList()
明示的に結果を収集することを言って、出会いの順にを。
そこで、以下では確かに簡単で、正確かつ効率的なソリューションでなければなりません。
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class CollectToListOfList {
static class Widget {
String code;
String name;
Widget(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
@Override
public String toString() {
return code + ": " + name;
}
}
public static void main(String[] args) {
List<Widget> widgetList = Arrays.asList(
new Widget("0", "A"),
new Widget("1", "B"),
new Widget("2", "C"),
new Widget("3", "D"),
new Widget("0", "E"),
new Widget("1", "F"),
new Widget("2", "G"),
new Widget("3", "H"),
new Widget("0", "I"),
new Widget("1", "J"));
Collection<List<Widget>> result = widgetList.stream()
.collect(Collectors.groupingBy(Widget::getCode, TreeMap::new, Collectors.toList()))
.values();
for (List<Widget> list : result) {
System.out.println(list);
}
}
}