在Java 8中组合函数和谓词 - java

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

参考方案

您不需要Predicate。只需计算总和并检查它是否> 1000。

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

或者,正如Holger所评论的那样,当您想通过返回Predicate的单个参数实现函数时,boolean接口是更合适的功能接口:

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

在Java Eclipse项目中存储XSD文件的约定 - java

在Java Eclipse项目中用于存储.xsd文件的常规文件夹是什么?例如,.jars保留在/lib中。 .xsd文件将存储在哪里? 参考方案 我通常将XML模式放在/src/main/resources/XSD中,但是正如从JAXB project中可以看到的那样,它们通常被放在具有最相关包的深层源文件夹中。

在Java Swing中输入JButton的键焦点? - java

如何在Java Swing中使JButton的Enter键成为焦点?我已经这样做了btn_Login.registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("enter key pre…

Diamond运算符(<>)在Java 1.7中不起作用 - java

编译jsp文件时出现以下错误: 低于1.7的源级别不允许使用''运算符我正在使用jdk 1.7.x和eclipse Kepler另外我已经在Eclipse的项目首选项中设置了1.7 as compliance level,但是代码仍然无法正常工作我应该添加其他配置吗? 参考方案 检查Eclipse中的以下区域:Right Click Project >…

在Java 8中,为什么ArrayList的默认容量现在为零? - java

我记得,在Java 8之前,ArrayList的默认容量为10。出乎意料的是,对默认(无效)构造函数的评论仍然显示:Constructs an empty list with an initial capacity of ten.来自ArrayList.java:/** * Shared empty array instance used for defau…

Java:我可以在Hashmaps中使用数组吗? - java

我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();