如何使用rxjava和lambda表达式一次在Map中插入两条记录

vktxenjb  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(212)

我有一个记录列表,其中每个记录都有两个主键primary id和alternate id。我想制作一个Map,通过它我可以使用primary id或使用rxjava操作的alternate id访问处理过的记录。
目前的执行情况:

ImmutableMap.Builder<String, Record> mapBuilder = new ImmutableMap.Builder<>();
      fetchRecords()
          .forEach(
              record -> {
                parsedRecord = dosomething(record);
                mapBuilder.put(parsedRecord.getPrimaryId(), parsedRecord);
                mapBuilder.put(parsedRecord.getAlternativeId(), parsedRecord);
              });
      return mapBuilder.build();

我希望它看起来像什么:

fetchRecords().stream()
    .map(doSomething)
    .collect(Collectors.toMap(RecordData::getPrimaryId, Function.identity()));
// Need to add this as well
.collect(Collectors.toMap(RecordData::getAlterantiveId, Function.identity()));

我只是想知道是否有一种方法可以在一次通过fetchrecords()的过程中将次要id添加到记录Map中。

v8wbuo2f

v8wbuo2f1#

我不熟悉RXJava,但这可能提供了一个起点。创建自定义收集器以添加两个键。这是一个非常基本的收集器,除了使用提供的最后一个外,不会处理重复的密钥。我只是用了新的 record Java15中引入的创建不可变 "class" . 这对普通班来说也是一样的。

record ParsedRecord(String getPrimaryId,
        String getAlternativeId, String someValue) {
    @Override
    public String toString() {
        return someValue;
    }
}

List<ParsedRecord> records =
        List.of(new ParsedRecord("A", "B", "value1"),
                new ParsedRecord("C", "D", "value2"));

Map<String, ParsedRecord> map = records.stream()
        .collect(Collector.of(
                HashMap<String, ParsedRecord>::new,
                (m, r) -> {
                    m.put(r.getPrimaryId(), r);
                    m.put(r.getAlternativeId(), r);
                }, (m1, m2) -> {
                    m1.putAll(m2);
                    return m1;
                }, Characteristics.UNORDERED));

map.entrySet().forEach(System.out::println);

打印以下内容:

A=value1
B=value1
C=value2
D=value2

相关问题