加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java 8中结合函数和谓词

发布时间:2020-12-15 05:14:42 所属栏目:Java 来源:网络整理
导读:在isBigOrder方法中,如果订单中产品的总价格大于1000,则必须返回true.我怎么用 java 8编写它?我写了总和部分,但我无法完成它. public FunctionOrder,Boolean isBigOrder() { FunctionOrder,OptionalLong sum = a - a.getProducts() .stream() .map(P - P.ge
在isBigOrder方法中,如果订单中产品的总价格大于1000,则必须返回true.我怎么用 java 8编写它?我写了总和部分,但我无法完成它.

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 ????;
    }

如果需要其他类:

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;
    }    
}

解决方法

你不需要谓词.只需计算总和并检查它是否是> 1000.

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

或者,正如Holger所评论的,当你想用一个返回布尔值的参数实现一个函数时,Predicate接口是一个更合适的函数接口:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读