Apache Commons CollectionsUtils.select的Java 8 Lambda替换

Apache Commons CollectionsUtils.select的Java 8 Lambda替换,java,lambda,java-8,apache-commons,java-stream,Java,Lambda,Java 8,Apache Commons,Java Stream,我使用Apache Commons库编写了以下代码: public static List<Address> addressesHasType(final List<Address> addresses, final AddressType... types) { return (List<Address>) CollectionUtils.select(addresses, new Predicate() { @Override

我使用Apache Commons库编写了以下代码:

public static List<Address> addressesHasType(final List<Address> addresses, final AddressType... types) {
    return (List<Address>) CollectionUtils.select(addresses, new Predicate() {
        @Override
        public boolean evaluate(final Object object) {
            boolean isContains = false;
            for (int i = 0; i < types.length && !isContains; i++) {
                isContains = ((Address) object).getTypes().contains(types[i]);
            }
            return isContains;
        }
    });
}

我如何做到这一点?

您的第一个谓词使用
包含(类型[I])
。您的第二个使用
包含(类型)


所以他们根本不做同样的事情。第二个谓词检查类型是否包含AddressType
类型的数组,而不是检查它是否包含AddressType
类型数组的一个元素。如果代码中有两个嵌套循环,则检查它。外部循环的转换看起来不错,但转换后的代码中缺少内部循环。让我们先看一下内环:

boolean evaluate(Address address, AddressTypes... types) {
    for (AddressType type : types) {
        if (address.getTypes().contains(type)) {
            return true;
        }
    }
    return false;
}
使用流和方法引用,实现如下所示:

boolean evaluate(Address address, AddressTypes... types) {
    return Arrays.stream(types).anyMatch(address.getTypes()::contains);
}
public static List<Address> addressesHasType(List<Address> addresses, AddressType... types) {
    return addresses.stream()
        .filter(a -> Arrays.stream(types).anyMatch(a.getTypes()::contains))
        .collect(Collectors.toList());
}
将此转换与第一种方法相结合,结果如下所示:

boolean evaluate(Address address, AddressTypes... types) {
    return Arrays.stream(types).anyMatch(address.getTypes()::contains);
}
public static List<Address> addressesHasType(List<Address> addresses, AddressType... types) {
    return addresses.stream()
        .filter(a -> Arrays.stream(types).anyMatch(a.getTypes()::contains))
        .collect(Collectors.toList());
}
公共静态列表地址SHASTYPE(列表地址、地址类型…类型){
返回地址。stream()
.filter(a->Arrays.stream(types).anyMatch(a.getTypes()::contains))
.collect(Collectors.toList());
}