2016-02-13 440 views
0

我有一個靜態方法,它使用java 8流標識一個集合中的匹配類型。在Java 8流中返回第一個匹配(類似於_.find)

而不是使用.filter.findAny,我想使用類似lodash的_.find的方法,將「通過集合的元素進行迭代,並返回第一個元素斷言返回truthy的。」

一個「發現」類型的方法大概使代碼更高性能和簡潔

public static List<Class> types = Arrays.asList(
    Contact.class, 
    Response.class, 
    Request.class 
); 

public static Optional<Class> resolveTypeFromFieldNames(Set<String> itemFields) { 
    return types 
     .stream() 
     .filter(itemType -> { 
      Set<String> fields = Arrays.stream(itemType.getDeclaredFields()) 
        .filter(f -> !f.isSynthetic()) 
        .map(Field::getName) 
        .collect(Collectors.toSet()); 
      return itemFields.equals(fields); 
     }) 
     .findAny(); 
} 

回答

4

不,你已經是完全做到這一點的方式,它實際上不是任何少高性能。 filter是懶惰地執行的,這意味着只有在找到與謂詞匹配的第一個元素之前,謂詞纔會被評估。它確實是而不是評估所有元素的謂詞。

你有什麼是Stream框架設計者打算做這個操作的方式。

+0

謝謝,這很好。 – eblahm

相關問題