在Java8中组合函数和谓词

在Java8中组合函数和谓词,java,java-8,functional-programming,predicate,functional-interface,Java,Java 8,Functional Programming,Predicate,Functional Interface,在isBigOrder方法中,如果订单中产品的总价格大于1000,则必须返回true。如何使用Java8编写它?我写了总结部分,但没能完成 public Function<Order, Boolean> isBigOrder() { Function<Order, Optional<Long>> sum = a -> a.getProducts() .stream() .m

isBigOrder
方法中,如果订单中产品的总价格大于1000,则必须返回true。如何使用Java8编写它?我写了总结部分,但没能完成

public Function<Order, Boolean> isBigOrder() {

        Function<Order, Optional<Long>> sum = a -> a.getProducts()
                .stream()
                .map(P -> P.getPrice())
                .reduce((p1,p2)->p1+p2);

        Predicate <Optional<Long>> isBig =  x -> x.get() > 1000 ;

        return ????;
    }
公共函数isBigOrder(){
函数sum=a->a.getProducts()
.stream()
.map(P->P.getPrice())
.减少((p1,p2)->p1+p2);
谓词isBig=x->x.get()>1000;
返回????;
}
如果需要其他类别:

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

enum ProductType { NORMAL, BREAKABLE, PERISHABLE }

public class Product {
    private String code;
    private String title;
    private long price;
    private ProductState state;
    private ProductType type;

    //all fields have getter and setter

    public Product price(long price) {
        this.price = price;
        return this;
    }
}

public class Order {

    private String code;
    private long price;
    private String buyyer;
    private OrderState state;
    private List<Product> products = new ArrayList<>();

    //all fields have getter and setter

    public Order price(long price) {
        this.price = price;
        return this;
    }

    public Order product(Product product) {
        if (products == null) {
            products = new ArrayList<>();
        }
        products.add(product);
        return this;
    }    
}
enum OrderState{已确认、已付款、已处理仓库、准备发送、已交付}
枚举产品类型{正常、易碎、易腐}
公共类产品{
私有字符串码;
私有字符串标题;
私人多头价格;
私人产品和国家;
私人产品类型;
//所有字段都有getter和setter
公共产品价格(长期价格){
这个价格=价格;
归还这个;
}
}
公共阶级秩序{
私有字符串码;
私人多头价格;
私人字符串买方;
私人秩序国家;
私有列表产品=新的ArrayList();
//所有字段都有getter和setter
公共秩序价格(长期价格){
这个价格=价格;
归还这个;
}
公共秩序产品(产品){
如果(产品==null){
products=新的ArrayList();
}
产品。添加(产品);
归还这个;
}    
}

您不需要
谓词。只需计算总和并检查其是否大于1000

public Function<Order, Boolean> isBigOrder() {
    return o -> o.getProducts()
                 .stream()
                 .mapToLong(Product::getPrice)
                 .sum() > 1000;
}

例如,假设您无法在编写状态下组合这两个函数,因为它们来自不同的地方,您可以按如下方式组合它们:

public static Function<Order,Boolean> combine(
    Function<Order, Optional<Long>> f
,   Predicate <Optional<Long>> pred
) {
    return a -> pred.test(f.apply(a));
}
公共静态功能组合(
函数f
,谓词pred
) {
返回a->pred.test(f.apply(a));
}

为什么要返回
函数
?返回
boolean
并将方法放入
Order
类有什么好处?您的
if(products==null){products=new ArrayList();}
语句完全过时,因为您总是使用
ArrayList
初始化
products
字段。如果您想确保没有人用
null
覆盖它,那么将其声明为
final
。。另一个附带说明是,
a->{long value=0;for(Product p:a.getProducts()){value+=p.getPrice();if(value>1000)返回true;}返回false;}
虽然不流畅,但效率更高,因为它可以在超过阈值时立即返回,而不是不必要地继续处理所有元素。
public static Function<Order,Boolean> combine(
    Function<Order, Optional<Long>> f
,   Predicate <Optional<Long>> pred
) {
    return a -> pred.test(f.apply(a));
}