2016-04-21 112 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