使用谓词创建功能



我是Java 8的新手,我正在尝试使用谓词和功能。我有我的POJO类产品,该产品具有长ID,字符串类别。我创建谓词水果&饮料分别检查1000至2000至3000至4000的ID。

我还创建了一个函数,将类别设置为"水果"/"饮料"的函数。现在,要检查有条件语句中使用谓词的产品的ID范围,该语句将错误显示为"多个标记",当将相同的代码放入If/else Block中时,请按预期

绝对工作。

//谓词

          Predicate <Product> checkFruitsLimitProduct = (product) -> product.getId().intValue() >= 1000 && product.getId().intValue() < 2000;
    Predicate <Product> checkDrinksLimitProduct = (product) -> product.getId().intValue() >= 3000 && product.getId().intValue() < 4000;

//有条件语句的功能

      Function <Product, Product> setCategory = (product) -> {
        checkFruitsLimitProduct.test(product) ? product.setCategory("Fruits") : checkDrinksLimitProduct.test(product))?
                product.setCategory("YS") : product.setCategory("YS");
    return product;
    }; 

//在if/else block上功能正常

        Function <Product, Product> setCategory = (product) -> {
                 if(checkFruitsLimitProduct.test(product)) {
            product.setCategory("Fruits") ;
        }else if(checkDrinksLimitProduct.test(product)) {
            product.setCategory("Drinks");
        }else {
            product.setCategory("YS");
        }
     return product;
      };   

//打印功能值

          Product p1 = new Product(1000L);
          Product p2 = new Product(3000L);
          System.out.println(setCategory.apply(p1));
      System.out.println(setCategory.apply(p2));

带有条件语句错误为:线程中的异常" main" java.lang.error:未解决的汇编问题

三元运算符不应真正用于副作用。但是,如果您想完成嵌套的三元组来设置类别,则应从setCategory

返回Product
public Product setCategory(String category) {
    this.category = category;
    return this;
}

然后您的Function可以写为

Function<Product, Product> setCategory = (product) -> checkFruitsLimitProduct.test(product) ? product.setCategory("Fruits") :
        checkDrinksLimitProduct.test(product) ? product.setCategory("Drinks") : product.setCategory("YS");

首先,不要这样做:

product.getId().intValue()

想象一下,如果有比Max Integer大的时间会发生什么。

其次,您不需要功能。功能具有输入和输出。但是您真正想要的是更新输入。为此,它存在消费者。要使用Ternary,您将条件放入product.setCategory(condition goes here);中:

Consumer<Product> setCategory = (product) ->  product.setCategory( checkFruitsLimitProduct.test(product) ? "Fruits" :checkDrinksLimitProduct.test(product) ? "Drinks":"YS")

而不是申请,您有接受方法:

Product p1 = new Product(1000L);
setCategory.accept(p1);
System.out.println(p1.getCategory());

最新更新