2016-04-21 110 views
1

我有一个类可以计算在java中使用Lambdas的语句的平均单词数。我遇到的问题是,如果corp为null或为空,我需要返回0.目前,我得到NaN,如果corp为null或为空。我的代码的其余部分做它应该做的,但我无法弄清楚这一部分。使用lambdas检查是否等于null或空

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

为什么不老式的方式,明确地检查它? (虽然,坦率地说:http://stackoverflow.com/a/6921270/869736) –

+0

'corp == null'是最好也是最简单的方法,你什么意思是空'corp'? – 11thdimension

+1

我不允许使用控制结构。这就是为什么这是困难的,我会张贴公司很快。 – ObiJuanKanobe

回答

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); 
    } 

} 

`

+0

它不会让我这样做,因为corp已经在apply方法中定义了。 – ObiJuanKanobe

+0

你为什么不把它重命名为别的? – nikelin

0

从OP的评论,

语料库语料库=新语料库(“国王”,文字);所以,如果其中王字符串为空或null,则我不得不返回0

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

像@nikelin发布的那样,Optional会帮助你。使用Optional.filter()可以不使用控制结构分支。例如,你可以这样做测试,看看如果“王”的价值是存在的,如果它为空或空字符串,返回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或为空,则流操作将继续进行,获取文本并按您指定的计算字数。然后它将单词计数映射到sentenceCount/wordCount并返回该单词计数,但如果您的king属性为null,则过滤器将使Optional为空,映射操作将被跳过,而orElse(0.0)中的值将被返回。

0

更改return语句:

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

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

+0

有趣的是,你这样做,因为这正是我最终做的。 – ObiJuanKanobe