2016-09-22 62 views
4

我在閱讀「真正不耐煩的Java SE 8」,我看到一些好奇的代碼。它是這樣的:Java 8模式謂詞使用流 - 如何推斷變量?

final Pattern pattern = Pattern.compile("....."); 
final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
     .filter(pattern.asPredicate()) 
     .count(); 

我只是想,asPredicate方法會是這樣的

public boolean asPredicate(String stringToMatch){ 
    ..... 
} 

但真正實現這樣的

public Predicate<String>asPredicate(){ 
    return s -> matcher(s).find(); 
} 

我知道我可以使用像這是完全合法的:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
     .filter(a->pattern.matcher(a).find()) 
     .count(); 

但我的問題是流如何將字符串傳遞給模式實例?如何 「克里斯蒂安」, 「丹尼爾」, 「奧爾蒂斯」, 「奎利亞爾」 每被傳遞給方法s -> matcher(s).find()。我的意思是字符串如何通過併成爲asPredicate方法的s變量。

+4

你知道你可以通過'certainKindOfExpression'到'.filter(...)',那麼,爲什麼它是一個謎,你可以調用'的someMethod()'代替,其中包含'return certainKindOfExpression',然後將'someMethod()'的結果傳遞給'.filter(...)'?這對lambda表達式並不特別。如果你明白如何在'filter'中傳遞一個lambda表達式,就像你聲稱的那樣,你應該理解相同的lambda表達式如何與'return'語句一起工作。當然,不管你調用lambda的參數's'還是'a'都沒有區別。 – Holger

回答

4

Predicate接口是一個功能接口,定義一個抽象方法boolean test(T t)其中T在這種情況下是String類型,因爲您是在Stream<String>濾波。換句話說,代碼等同於:

final long count = Stream.of("Cristian","Daniel","Ortiz","Cuellar") 
    .filter(new Predicate<String>() { 
     public boolean test(String s) { 
      return matcher(s).find(); 
     } 
    }) 
    .count(); 
+0

非常感謝。 – chiperortiz