【问题标题】:How to return Optional String using Java 8 streams如何使用 Java 8 流返回可选字符串
【发布时间】:2015-05-30 17:33:05
【问题描述】:

当给定siteUrl 包含预定义对列表中的键时,此代码应返回Optional 字符串(否则Optional.empty())。

有没有比在这里使用new Pair(null, null) 更好的方法?或者也许改变整个表达式?

static Optional<String> get(String siteUrl) {
    return Optional.ofNullable(URL_TO_ENVIRONMENT
            .stream()
            .filter(p -> siteUrl.contains(p.getKey()))
            .findFirst().orElse(new Pair(null, null)).getValue());
}

private static final List<Pair> URL_TO_ENVIRONMENT = buildList();

private static List<Pair> buildList() {
    return Arrays.asList(
            new Pair("aaa.mysite.com", "aaa_something"),
            new Pair("bbb.mysite.com", "bbb_something"),
            new Pair("ccc.mysite.com", "ccc_comething"));
}

【问题讨论】:

    标签: java java-8 java-stream optional


    【解决方案1】:
    return URL_TO_ENVIRONMENT.stream()
        .filter(p->siteUrl.contains(p.getKey()))
        .map(Pair::getvalue)
        .findFirst();
    

    您是否特别需要第一场比赛?如果您只是想要任何匹配,请使用 findAny 而不是 findFirst

    【讨论】:

    • 哇,这速度真快。我实际上只需要“任何匹配”。谢谢你,米莎!
    • 我更喜欢URL_TO_ENVIRONMENT.stream().filter(p-&gt;siteUrl.contains(p.getKey())).findAny().map(Pair::getvalue);。这种方式映射是在管道之外完成的,从而使管道更短(更少的堆栈深度,更多的内联机会等)。
    • @TagirValeev 在我的观察中,OptionalmapfilterflatMap)上的流式操作往往会让人失望。所以我有一个(非常)轻微的偏好来避免它们。
    • @Tagir Valeev:总堆栈深度无关紧要,因为热点仍然跨越相同的最深堆栈帧。
    • @Holger:有时它确实很重要,因为它可以达到 MaxInlineLevel 限制,所以你会有一些没有内联的东西,否则会被内联。稍后将尝试制作一些示例基准...
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多