使用lambdas检查某些内容是否等于null或为空

时间:2016-04-21 02:00:25

标签: java lambda

我有一个类,它使用java中的Lambdas计算句子中的平均单词数。我遇到的问题是,如果corp为null或为空,我需要返回0.目前,如果corp为null或为空,我将获得NaN。我的其余代码做了应有的事情,但我无法弄清楚这一部分。

public class AverageNumberOfWordsPerSentence extends TextMetric<Double> {
@Override
public Double apply(final Corpus corp) {
    Sentences sentences = new Sentences();
    List<String> sentenceList = sentences.apply(corp);

    LongSummaryStatistics lss = corp.texts().stream()
                                    .map(blob -> blob.text())
                                    .flatMap(string -> stream
                                    (string.split("\\W+")))
                                    .filter(string -> !string.isEmpty())
                                    .mapToLong(String::length)
                                    .summaryStatistics();                                   
                                    return (double)lss.getCount() / 
                                                   sentenceList.size();
}

3 个答案:

答案 0 :(得分:0)

如果我找到了你,那么你需要使用java.util.Optional

class AverageNumberOfWordsPerSentence {
    public Double apply(final Corpus corp) {
        return Optional.of(corp).map(corp -> {
            Sentences sentences = new Sentences();
            List<String> sentenceList = sentences.apply(corp);

            LongSummaryStatistics lss = corp.texts().stream()
                    .map(blob -> blob.text())
                    .flatMap(string -> stream
                            (string.split("\\W+")))
                    .filter(string -> !string.isEmpty())
                    .mapToLong(String::length)
                    .summaryStatistics();
            return (double) lss.getCount() /
                    sentenceList.size();
        }).orElse(0);
    }

}

`

答案 1 :(得分:0)

来自OP的评论,

  

语料库语料库=新语料库(“国王”,文本);因此,如果king所在的字符串为空或为null,则我必须返回0。

如果Corpus的成员为空或空,则需要有一些条件逻辑绕过流。 OP没有说出持有“King”的财产的名称是什么,所以我现在假设它是getKing()

就像@nikelin发布的那样,Optional会在这里帮到你。使用Optional.filter(),您可以在不使用控制结构的情况下进行分支。例如,您可以执行此操作以测试“king”值是否存在,如果它为null或空字符串,则返回0,否则获取文本度量标准:

return Optional.of(corp)
     .filter(c -> c.getKing() != null && !c.getKing().isEmpty()) // skip to the orElse() if it is null or empty)
     .map(c -> c.texts())  // or .map(Corpus::texts)
     .map(t -> t.stream()...blah blah get the word count...)
     .map(count -> (double) count / sentences) 
     .orElse(0.0)

任何连续的.map()操作序列都可以组合成一个,你的选择。

如果初始Optional.filter发现您的“king”属性不为null或为空,则流操作继续进行流操作,获取文本并按照您已指定的方式计算字数。然后它将单词count映射到sentenceCount / wordCount并返回该值,但是如果你的king属性为null,则过滤器将保留为Empty,将跳过map操作,并返回orElse(0.0)中的值。

答案 2 :(得分:0)

将return语句更改为:

return sentenceList.isEmpty() ? 0.0 : (double)lss.getCount() / sentenceList.size();

然后希望告诉你“不使用控制结构”的人会接受它。严格来说,?:运算符控制结构,但它没有ifwhile这样的关键字。