2016-03-14 26 views
0

我有這樣的代碼:爲什麼我不能將謂詞應用到java流過濾器?

@Override 
public List<Device> getAvailableDevices(Predicate<Device> filter) { 
    return deviceRepository.getDevices() 
      .stream() 
      .filter(filter) 
      .collect(Collectors.toList()); 
} 

,我得到這個錯誤:

Error:(55, 25) java: incompatible types: com.google.common.base.Predicate<com.m.automation.common.mobile.services.devices.dataModel.Device> cannot be converted to java.util.function.Predicate<? super com.m.automation.common.mobile.services.devices.dataModel.Device> 

我怎樣才能解決這個問題?

+0

這些是兩種不同的謂詞類型 – Whymarrh

+0

您可能能夠使用Guava類型的方法引用(即'filter :: apply') – Whymarrh

+2

您正在導入錯誤的'Predicate'類型:它應該是'java。 util.function.Predicate' – Tunaki

回答

1

您正在使用番石榴謂詞,而不是java.util.function.Predicate。這由源文件中的import語句確定。

如果您可以更改此代碼及其調用者,請將此方法的類型更改爲接受java.util.function.Predicate。只需更改導入指令即可完成此操作,但可能會影響其他代碼;如果您確實想要在其他地方繼續使用Guava謂詞,則可以使用完全限定名稱java.util.function.Predicate來更改此方法。

如果您不能對此方法簽名進行更改,請使用filter(filter::apply)替代filter(filter),將您的過濾器改爲標準Predicate