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

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

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

  1. ImmutableMap.Builder<String, Record> mapBuilder = new ImmutableMap.Builder<>();
  2. fetchRecords()
  3. .forEach(
  4. record -> {
  5. parsedRecord = dosomething(record);
  6. mapBuilder.put(parsedRecord.getPrimaryId(), parsedRecord);
  7. mapBuilder.put(parsedRecord.getAlternativeId(), parsedRecord);
  8. });
  9. return mapBuilder.build();

我希望它看起来像什么:

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

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

v8wbuo2f

v8wbuo2f1#

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

  1. record ParsedRecord(String getPrimaryId,
  2. String getAlternativeId, String someValue) {
  3. @Override
  4. public String toString() {
  5. return someValue;
  6. }
  7. }
  8. List<ParsedRecord> records =
  9. List.of(new ParsedRecord("A", "B", "value1"),
  10. new ParsedRecord("C", "D", "value2"));
  11. Map<String, ParsedRecord> map = records.stream()
  12. .collect(Collector.of(
  13. HashMap<String, ParsedRecord>::new,
  14. (m, r) -> {
  15. m.put(r.getPrimaryId(), r);
  16. m.put(r.getAlternativeId(), r);
  17. }, (m1, m2) -> {
  18. m1.putAll(m2);
  19. return m1;
  20. }, Characteristics.UNORDERED));
  21. map.entrySet().forEach(System.out::println);

打印以下内容:

  1. A=value1
  2. B=value1
  3. C=value2
  4. D=value2
展开查看全部

相关问题