用 lambda 替换 for 循环

hsa*_*dik 7 java java-stream

我有以下代码:

@Override
public String parsePrice(Document document) {
    Elements metaElements = document.getElementsByTag("meta");
    for (Element tag : metaElements) {
        String content = tag.attr("content");
        String item = tag.attr("itemprop");

        if ("price".equals(item)) {
            return content.equals("0") ? "Free" : content;
        }
    }
    return "Information not available";
}
Run Code Online (Sandbox Code Playgroud)

它将返回类似“7,49$”的价格。我想用 java 8 功能替换此代码。我是流的新手,但尝试过:

metaElements.stream().filter(tag -> "price".equals(tag.attr("itemprop")))
                .findFirst().orElse(null);
Run Code Online (Sandbox Code Playgroud)

但它返回 <meta itemprop="price" content="7,49$">

我不能像这样过滤(缺少 return 语句):

metaElements.stream().filter(tag -> {
            String content = tag.attr("content");
            String item = tag.attr("itemprop");

            if ("price".equals(item)) {
                return content.equals("0") ? "Free" : content;
            }
        }).findFirst().orElse(null);
Run Code Online (Sandbox Code Playgroud)

如何解决?

Ous*_* D. 6

您在这里的尝试很接近:

metaElements.stream()
            .filter(tag -> "price".equals(tag.attr("itemprop")))
            .findFirst()
            .orElse(null);
Run Code Online (Sandbox Code Playgroud)

你只需要在 例如之后map+orElsefindFirst

return metaElements.stream()
            .filter(tag -> "price".equals(tag.attr("itemprop")))
            .findFirst()
            .map(tag -> tag.attr("content").equals("0") ? 
                         "Free" : tag.attr("content"))
            .orElse("Information not available");
Run Code Online (Sandbox Code Playgroud)