我有一个类,它使用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();
}
答案 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();
然后希望告诉你“不使用控制结构”的人会接受它。严格来说,?:
运算符是控制结构,但它没有if
或while
这样的关键字。