有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java将函数传递给方法

我试图把一个函数传递给这个方法。问题是,如果不重复同样的论点,我就无法让它起作用

 public void addCartProduct(String cartId, long productId) {
        updateCartProducts(cartId, productCartDto -> productCartDto.addProduct(show(productId)));
    }

    public void removeCartProduct(String cartId, long productId) {
        updateCartProducts(cartId, productCartDto -> productCartDto.removeProduct(show(productId)));
    }

    private void updateCartProducts(String cartId, Function<ProductCartDto,ProductCartDto> processCart){
        productCartRepository.showCart(cartId)
                .map(processCart)
                .map(productCartDto -> productCartRepository.updateCart(cartId, productCartDto))
                .orElseThrow(() -> new NoResultException("Cannot find cart ID: " + cartId));
    }

编辑:添加显示方法

public ProductBasicDto show(Long productId) {
        return productRepository
                .findOptionalById(productId)
                .orElseThrow(() -> new NoResultException("Cannot find product ID: " + productId));
    }

这里的方法show()是多余的。有没有可能让updateCartProducts负责这种方法?我不能对现有的课程做任何改变。区别在于第一个添加产品,第二个删除


共 (1) 个答案

  1. # 1 楼答案

    依我看,你的代码没有问题。如果您想摆脱这两个方法中的show方法调用,可以将其移动到updateCartProducts方法中,并用一个BiFunction替换Function,该BiFunction接受一个ProductCartDto和一个ProductBasicDto并生成一个ProductCartDto

    public void addCartProduct(String cartId, long productId) {
        updateCartProducts(cartId, (productCartDto, productBasicDto) -> productCartDto.addProduct(productBasicDto));
    }
    
    public void removeCartProduct(String cartId, long productId) {
        updateCartProducts(cartId, (productCartDto, productBasicDto) -> productCartDto.removeProduct(productBasicDto));
    }
    
    private void updateCartProducts(String cartId, BiFunction<ProductCartDto, ProductBasicDto, ProductCartDto> processCart){
        //The code from show method
        ProductBasicDto productBasicDto = productRepository
                .findOptionalById(productId)
                .orElseThrow(() -> new NoResultException("Cannot find product ID: " + productId));
    
        productCartRepository.showCart(cartId)
                .map(processCartDto -> processCart.apply(processCartDto, productBasicDto))
                .map(productCartDto -> productCartRepository.updateCart(cartId, productCartDto))
                .orElseThrow(() -> new NoResultException("Cannot find cart ID: " + cartId));
    }