Moh*_*nan 6 lambda guava java-8
我有
class CustomObject {
Integer day;
List<InnerObject> innerObjects;
///getter setter
}
class InnerObject {
String id;
List<String> someVal;
//getter setter
}
Run Code Online (Sandbox Code Playgroud)
我有一个
List<CustomObject>
而且我要
Table<String, Integer, List<String>>
我希望表代表id (from InnerObject)- >(day (from Custom object),List of someVal (from InnerObject)
为了使它干净我调整了一点名称,但结构与预期相同.
现在我的表现如何
final List<CustomObject> objects = ???
final Map<Integer, List<InnerObject>> dayVsInnerObjects = objects.stream()
.collect(toMap(CustomObject::getDay, CustomObject::getInnerObjects));
final Table<String, Integer, List<String>> table = HashBasedTable.create();
dayVsInnerObjects.forEach((day, innerObjects) ->
innerObjects.forEach(i -> {
table.put(i.getId(), day, i.getSomeVal());
})
);
Run Code Online (Sandbox Code Playgroud)
我的问题:
您可以flatMap在初始流上使用以获取Map.Entry<Integer, InnerObject>(关键是当天)的流,并使用这些条目Table通过Guava的Tables.toTable内置收集器直接收集到:
Table<String, Integer, List<String>> table = objects.stream()
.flatMap(custom -> custom.getInnerObjects().stream()
.map(inner -> new SimpleEntry<>(custom.getDay(), inner)))
.collect(Tables.toTable(
entry -> entry.getValue().getId(),
entry -> entry.getKey(),
entry -> entry.getValue().getSomeVal(),
HashBasedTable::create));
Run Code Online (Sandbox Code Playgroud)
如果你想要Table不可变,你可以使用Guava的方法Tables.unmodifiableTable:
Table<String, Integer, List<String>> unmodifiableTable = Tables.unmodifiableTable(table);
Run Code Online (Sandbox Code Playgroud)
或者,如果您想Table在收集时获得不可修改的内容:
Table<String, Integer, List<String>> unmodifiableTable = objects.stream()
.flatMap(custom -> custom.getInnerObjects().stream()
.map(inner -> new SimpleEntry<>(custom.getDay(), inner)))
.collect(Collectors.collectingAndThen(
Tables.toTable(
entry -> entry.getValue().getId(),
entry -> entry.getKey(),
entry -> entry.getValue().getSomeVal(),
HashBasedTable::create),
Tables::unmodifiableTable);
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是Guava版本22.0,但正如Eugene在下面的评论中所述,此功能从版本21.0开始提供.
至于你的问题,我想我已经回答了1和2.关于3,不,没有办法减少时间复杂度,因为你需要访问每个InnerObject内容CustomObject.