【问题标题】:Combine two Functions in Java8在Java8中组合两个函数
【发布时间】:2018-06-29 16:36:53
【问题描述】:

isReadyToDeliver 方法中,如果订单中的所有产品都可用 (ProductState.AVAILABLE) 并且如果订单状态已准备好发送 (OrderState.READY_TO_SEND),则方法必须返回 true。 我写了两部分,但我无法将它们组合起来,

我写了return orderState.andThen(productState),但得到这个错误:

Function<Order,Boolean> 类型中的方法andThen(Function<? super Boolean,? extends V>) 不适用于参数(Function<Order,Boolean>)

public class OrderFunctions  {

    public Function<Order, Boolean> isReadyToDeliver() {            
        Function<Order, Boolean> orderState = o -> o.getState() == OrderState.READY_TO_SEND;            
        Function<Order, Boolean>  productState = 
                o -> o.getProducts()
                    .stream()
                    .map(Product -> Product.getState())
                    .allMatch(Product -> Product == ProductState.AVAILABLE);

        return ????? ; 
       //return  orderState.andThen(productState);
       //error: The method andThen(Function<? super Boolean,? extends V>) in the type Function<Order,Boolean> is not applicable for the arguments (Function<Order,Boolean>)      
    }
}

如果需要其他类:

enum OrderState {CONFIRMED, PAID, WAREHOUSE_PROCESSED, READY_TO_SEND, DELIVERED }

enum ProductType { NORMAL, BREAKABLE, PERISHABLE }

public class Order {

    private OrderState state;
    private List<Product> products = new ArrayList<>();

    public OrderState getState() {
        return state;
    }

    public void setState(OrderState state) {
        this.state = state;
    }

    public Order state(OrderState state) {
        this.state = state;
        return this;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public Order product(Product product) {
        if (products == null) {
            products = new ArrayList<>();
        }
        products.add(product);
        return this;
    }
}

public class Product {

    private String code;
    private String title;
    private ProductState state;

    public ProductState getState() {
        return state;
    }

    public void setState(ProductState state) {
        this.state = state;
    }

    public Product state(ProductState state) {
        this.state = state;
        return this;
    }
}

【问题讨论】:

标签: java lambda java-8 functional-programming functional-interface


【解决方案1】:

如果您将isReadyToDeliver() 更改为返回Predicate&lt;Order&gt;,那么您将能够将两个谓词与.and(Predicate another) 函数结合起来:

public Predicate<Order> isReadyToDeliver() {
    Predicate<Order> orderState = o -> o.getState() == OrderState.READY_TO_SEND;

    Predicate<Order> productState =
                o -> o.getProducts()
                   .stream()
                   .map(Product -> Product.getState())
                   .allMatch(Product -> Product == ProductState.AVAILABLE);

    return orderState.and(productState);
}

您的函数组合示例不起作用,因为当您组合函数fg 时,gf 函数返回的参数值作为参数值。在您的情况下,它被破坏了,因为orderState 期望Order 并返回Boolean,而在这种情况下orderState.andThen() 期望一个将Boolean 作为参数并返回其他内容的函数。未满足此要求,因为 productState 预期 Order 并返回 Boolean。这正是以下错误所说的:

错误:Function类型中的方法andThen(Function)不适用于参数(Function)

但如果出于某种原因您想继续使用 Function&lt;Order, Boolean&gt;,那么您将返回一个 lambda,例如:

public Function<Order, Boolean> isReadyToDeliver() {
    Function<Order, Boolean> orderState = o -> o.getState() == OrderState.READY_TO_SEND;

    Function<Order, Boolean> productState =
            o -> o.getProducts()
                    .stream()
                    .map(Product -> Product.getState())
                    .allMatch(Product -> Product == ProductState.AVAILABLE);


    return (order) -> orderState.apply(order) && productState.apply(order);
}

【讨论】:

    【解决方案2】:

    来自orderStateproductState这两个函数 你可以使用&amp;&amp;(逻辑)创建一个新的lambda表达式 并返回:

    public Function<Order, Boolean> isReadyToDeliver() {
    
        Function<Order, Boolean> orderState = ...;
    
        Function<Order, Boolean>  productState = ...;
    
    
        return o -> orderState.apply(o) && productState.apply(o);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多