【问题标题】:Logging warning message while processing streams in java在 java 中处理流时记录警告消息
【发布时间】:2020-11-19 09:27:25
【问题描述】:

如果映射rdsDesksByName.get(e.getKey()) 没有任何键值,我想记录错误消息。 如何在流中处理此问题?

目前我返回createDeskWithScope(rdsDesksByName.get(e.getKey()),ds.outOfScope()),但是如果rdsDesksByName 没有任何键值,我如何增强此功能以记录错误消息,否则它应该照常处理

List<Desk> desks = deskScopesByName.entrySet()
    .stream()
    .flatMap(e -> {
        return deskScopesByName.get(e.getKey())
            .stream()
            .map(ds -> {
                return createDeskWithScope(rdsDesksByName.get(e.getKey()), ds.outOfScope());
            });                     
    })
   .collect(Collectors.toList());

【问题讨论】:

标签: java java-stream


【解决方案1】:

在平面映射操作中,通过key找到一个对象并使用if-else条件:

  • 如果对象是null(该键没有值),记录一条消息并返回Stream.empty()。
  • 否则,使用createDeskWithScope 方法继续处理。

下面是代码的样子(未经测试,但应该会给你一个想法):

List<Desk> desks = deskScopesByName.entrySet()
    .stream()
    .flatMap(entry -> {
        String key = entry.getKey();
        Desk rdsDesk = rdsDesksByName.get(key);
        if (rdsDesk == null) {
            log.warn("There is no Desk present for {}", key);
            return Stream.empty();
        } else {
            return entry.getValue()
                .stream()
                .map(ds -> createDeskWithScope(rdsDesk, ds.outOfScope()));
        }
    })
    .collect(Collectors.toList());

我建议将平面映射操作包装在一个方法中。

【讨论】:

  • deskScopesByName.keySet() 然后deskScopesByName.get(key) 表示使用entrySet 会更好。
  • 此外,更好的抽象是当您将这些代码块移动到一个方法时,如果不能重用,它可能是private,这在很大程度上提高了可读性。 (如果你推荐,也许你也应该编辑答案:))
  • 你说得对,纳曼,我没有注意到deskScopesByName.get(..) 使用了相同的地图。感谢您的留言。关于可读性,我同意私有方法。
  • @Holger:您将如何替换rdsDesksByName.get(key) 查找?这是一张与deskScopesByName 完全不同的地图。
  • 我被那些几乎相同的名字误导了。那么rdsDesksByName.get(key)的结果和createDeskWithScope(…)的返回值的类型是一样的吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2020-07-16
相关资源
最近更新 更多