将CustomObject列表转换为Guava Table集合,复杂性较低

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)

我的问题:

  1. 有没有更好的方法呢?可能是一个更好的番石榴/收集API,可以使它更清洁.
  2. 现在正在填充表,它是可变的.我们可以在创建它时让它变得不可变.
  3. 时间复杂度如果可以在这里减少.

Fed*_*ner 6

您可以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.