【问题标题】:Create Function Using Predicate使用谓词创建函数
【发布时间】:2019-08-07 04:20:01
【问题描述】:

我是 Java 8 的新手,我正在尝试使用谓词和函数。我有我的 pojo 类 Product,它有 Long Id , String 类别。我创建谓词 fruits & Drinks 分别检查 1000 到 2000 和 3000 到 4000 之间的 Id。

我还创建了一个函数,它将产品对象的类别设置为“水果”/“饮料”。现在要检查我在条件语句中使用谓词的产品的 id 范围,当相同的代码放在 if/else 块中时,它向我显示错误为“多个标记”,绝对按预期工作

//谓词

          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块的函数,效果很好

        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 中的异常:未解决的编译问题

【问题讨论】:

  • 您正在尝试运行无法编译的代码。不要那样做。 阅读编译错误消息并修复它们。一旦所有的东西都修复好了,那么你就应该开始运行你的代码了。
  • @JBNizet,实际上我不确定修复在哪里。相同的代码在 If/Else 中可以正常工作,而在条件语句中则不行。
  • 这就是为什么你需要从编译器读取错误信息。它告诉我们哪里出了问题,哪里出了问题。
  • 你的缩进是一团糟。你能解决它吗?

标签: java function java-8 conditional-statements predicate


【解决方案1】:

三元运算符不应该真正用于副作用。但是,如果你想完成嵌套三元设置类别,你应该从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");

【讨论】:

    【解决方案2】:

    首先,不要这样做:

    product.getId().intValue()
    

    想象一下如果 long 大于最大整数会发生什么。无需转换为 int。

    其次,您不需要函数。一个函数有一个输入和一个输出。 但是您真正想要的是更新输入。为此,它存在消费者。 要使用三元,您可以将条件放在product.setCategory(condition goes here); 中,如下所示:

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

    你有accept方法,而不是apply:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多