为什么不选一个提供偷看方法?

碳酸钙:

我很好奇,想知道为什么Java的可选没有提供peek类似的方法Stream的一个

peek方法的Javadoc所述的Stream界面态:

  • @apiNote这种方法主要存在于支持调试,您希望看到的元素,因为他们流过一定点在管道

这几乎正​​好说明我的使用情况:

@Override
@Transactional
public User getUserById(long id) {
    return repository.findById(id)
        .peek(u -> logger.debug("Found user = {} by id = {}", u, id))
        .orElseThrow(() -> new UserNotFoundException("id = " + id));
}

repository.findById回报率Optional<User>(见CrudRepository#findById))

但它不会编译,因为没有peek对方法Optional

所以没有peek方法上面的一切变换来:

@Override
@Transactional
public User getUserById(long id) {
  Optional<User> userOptional = repository.findById(id);
  if (userOptional.isPresent()) {
    logger.debug("Found user = {} with id = {}", userOptional.get(), id);
  }
  return userOptional.orElseThrow(() -> new UserNotFoundException("id = " + id));
}

它也可以做这样的事情(见本答案):

@NoArgsConstructor(access = PRIVATE)
public abstract class OptionalUtils {
    public static <T> UnaryOperator<T> peek(Consumer<T> consumer) {
        return t -> {
            consumer.accept(t);
            return t;
        };
    }
}

并与使用它map的方法:

return repository.findById(id)
    .map(OptionalUtils.peek(u -> logger.debug("Found user = {} with id = {}", u, id)))
    .orElseThrow(() -> new UserNotFoundException("id = " + id));

但我认为这是一个黑客,而不是清洁的使用Optional

由于Java 9可以转换OptionalStream,但流没有orElseThrow方法(显然它不应该)。

此外,也可以用做同样的ifPresent,但它返回void(对我来说似乎ifPresent不应该返回比其他任何东西void

我是不是滥用Optional

是不存在的peek方法故意的吗?(但与此同时Vavr的Option确实提供了peek方法。)

或者,它只是认为不值得吗?

奥斯曼·d:

嗯,只有设计者可以回答你的“精确”的细节,为什么有人支持选配没有偷看方法。

所以,现在,你坚持使用isPresent()它实际上在我看来,似乎只是罚款:

if (userOptional.isPresent()) 
    logger.debug("Found user = {} with id = {}", userOptional.get(), id);

或者,如果你想它作为管道的一部分,你可以考虑链接页面上的参考答案。

顺便说一句,鉴于新的stream方法JDK9的你可以这样做:

return repository.findById(id) // Optional<User>
                 .stream()  // Stream<User>
                 .peek(u -> logger.debug("Found user = {} by id = {}", u, id)) // Stream<User>
                 .findFirst() // Optional<User>
                 .orElseThrow(() -> new UserNotFoundException("id = " + id))

看到这个答案的一个类似的例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Go-get为什么要我选一个分支?

为什么 JobExecutionDecider 有一个 stepExecution 提供给决定方法?

为什么不标准的Java迭代器有偷看()?

为什么调用一个方法为空原子类不产生异常?

为什么不匹配的签名,一个实例方法参照工作?

为什么第一个交替不匹配?

为什么这个代表不触发是一个谜

没有一个说法。为什么不?

$ {@:-1}为什么不返回$ @的最后一个元素?

为什么不编写一个类的代码?

为什么不丢弃任何一个值?

为什么 Condvar 不唤醒最后一个线程?

为什么不附加第一个元素

为什么当一个函数类型参数传递,而不是消费者不,每个Java方法不抛出异常?

同一个方法改变两个状态,一个变第二个不,为什么?

为什么不画一个轨道而只画一个椭圆呢?

为什么一个查询返回相关实体,而另一个不返回?

当我提供了一个代理后,为什么Jetty要求提供ProxyTo

为什么Android导航组件屏幕不返回上一个Fragment,而是调用onViewCreated中previos Fragment的方法?

如果不包含歧义,为什么要添加一个方法会导致模棱两可的调用

为什么在Python 2.7中定义一个类而不继承一个对象不会导致__mro__方法?

为什么不编译器抛出一个错误说“不return语句”?

为什么一个JSONObject的put方法抛出JSONException?

为什么我的方法返回一个null数组?

为什么必须公开一个方法?

为什么Inpustream读取方法返回一个int?

方法链接-为什么这是一个好习惯?

为什么一个实例只能被main方法看到

为什么onViewCreated()提供的视图在一个方法中不为null,而在另一种方法中为null?