首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java streams .orElseThrow

Java streams .orElseThrow
EN

Stack Overflow用户
提问于 2015-12-18 13:51:09
回答 2查看 28.8K关注 0票数 6

我想从连接池项目转换一段代码,我一直在使用流

原始代码是

代码语言:javascript
复制
for (Map.Entry<JdbConnection,Instant> entry : borrowed.entrySet()) {
  Instant leaseTime = entry.getValue();
  JdbConnection jdbConnection = entry.getKey();
  Duration timeElapsed = Duration.between(leaseTime, Instant.now());
  if (timeElapsed.toMillis() > leaseTimeInMillis) {
    //expired, let's close it and remove it from the map
    jdbConnection.close();
    borrowed.remove(jdbConnection);

    //create a new one, mark it as borrowed and give it to the client
    JdbConnection newJdbConnection = factory.create();
    borrowed.put(newJdbConnection,Instant.now());
    return newJdbConnection;
  }
}

throw new ConnectionPoolException("No connections available");

我已经说到这一点了

代码语言:javascript
复制
borrowed.entrySet().stream()
                   .filter(entry -> Duration.between(entry.getValue(), Instant.now()).toMillis() > leaseTimeInMillis)
                   .findFirst()
                   .ifPresent(entry -> {
                     entry.getKey().close();
                     borrowed.remove(entry.getKey());
                   });


JdbConnection newJdbConnection = factory.create();
borrowed.put(newJdbConnection,Instant.now());
return newJdbConnection;

上面的代码可以编译,但当我在IfPresent之后添加orElseThrow时,我会得到以下结果

代码语言:javascript
复制
/home/prakashs/connection_pool/src/main/java/com/spakai/ConnectionPool.java:83: error: void cannot be dereferenced
                       .orElseThrow(ConnectionPoolException::new);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-18 14:09:54

这是因为ifPresent返回空值。它不能被链式连接。你可以这样做:

代码语言:javascript
复制
Entry<JdbConnection, Instant> entry =
    borrowed.entrySet().stream()
        .filter(entry -> Duration.between(entry.getValue(), Instant.now())
                            .toMillis() > leaseTimeInMillis)
        .findFirst()
        .orElseThrow(ConnectionPoolException::new));
entry.getKey().close();
borrowed.remove(entry.getKey());

你正在寻找的东西读起来会很好:

代码语言:javascript
复制
.findFirst().ifPresent(value -> use(value)).orElseThrow(Exception::new);

但要让它正常工作,ifPresent必须返回Optional,这可能有点奇怪。这意味着您可以将一个ifPresent链接到另一个,对值执行多个操作。这可能是一个很好的设计,但它不是Optional的创建者所采用的设计。

票数 16
EN

Stack Overflow用户

发布于 2017-05-16 09:05:42

使用map而不是isPresent,返回一个可选的值而不是一个异常。

代码语言:javascript
复制
borrowed.entrySet().stream()
               .filter(entry -> Duration.between(entry.getValue(), Instant.now()).toMillis() > leaseTimeInMillis)
               .findFirst()
               .map(entry -> {
                 entry.getKey().close();
                 borrowed.remove(entry.getKey());
                 JdbConnection newJdbConnection = factory.create();
                 borrowed.put(newJdbConnection,Instant.now());
                 return newJdbConnection;
               })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34349261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档