返回 Java 8 流中的第一个匹配项(类似于 _.find)

ebl*_*ahm 1 java functional-programming java-8 lodash java-stream

我有一个静态方法,它使用 java 8 流从集合中识别匹配类型。

而不是使用.filterand .findAny,我想使用类似于 lodash 的_.find的方法,即“迭代集合的元素并返回第一个元素谓词返回真值。”

“查找”类型的方法大概会使代码更加高效和简洁

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();
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 5

不,您已经拥有的完全是这样做的方式,并且实际上并没有降低性能。 filter延迟执行,这意味着只有在找到与谓词匹配的第一个元素之前,才会对谓词进行求值。它并没有计算谓词任何更多的元素比它。

您拥有的是 Stream 框架设计者希望您执行此操作的方式。