java - 如何使用函数式编程来进行字符串操作?

标签 java functional-programming command-pattern lambdaj functional-java

我正在编写一个函数,本质上我一遍又一遍地做同样的事情。我有下面列出的功能

public String buildGarmentsString(List<Garment> garments)
{
    StringBuilder garmentString = new StringBuilder(10000);
    for(int i=0;i<4;i++)
    {
        garmentString.append(this.garmentProductId(i,garments.get(i).getProductId()));
        garmentString.append(this.garmentColor(i,garments.get(i).getColor()));
        for(int j=0;j<garments.get(i).getSizes().size();j++)
        {
            //check xxsml
            if(garments.get(i).getSizes().get(j).getXxsml() >0)
            {
                garmentString.append(this.garmentSizes(i, Size.xxsml(),garments.get(i).getSizes().get(j).getXxsml()));

            }

            //check xsml
            if(garments.get(i).getSizes().get(j).getXsml() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.xsml(),garments.get(i).getSizes().get(j).getXsml()));
            }

            //check sml
            if(garments.get(i).getSizes().get(j).getSml() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.sml(),garments.get(i).getSizes().get(j).getSml()));
            }

            //check med
            if(garments.get(i).getSizes().get(j).getMed() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.med(),garments.get(i).getSizes().get(j).getMed()));
            }

            //check lrg
            if(garments.get(i).getSizes().get(j).getLrg() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.lrg(),garments.get(i).getSizes().get(j).getLrg()));
            }

            //check xlrg
            if(garments.get(i).getSizes().get(j).getXlg() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.xlg(),garments.get(i).getSizes().get(j).getXlg()));
            }

            //check xxlrg
            if(garments.get(i).getSizes().get(j).getXxl() >0)
            {
                garmentString.append(this.garmentSizes(i,Size.xxlg(),garments.get(i).getSizes().get(j).getXxl()));
            }

            //check xxxlrg
            if(garments.get(i).getSizes().get(j).getXxxl() >0)
            {
                garmentString.append(this.garmentSizes(i,Size.xxxlg(),garments.get(i).getSizes().get(j).getXxxl()));
            }


        }
    }
}

这是我的 dressSizes 函数:

public String garmentSizes(int garmentNumber, String size,int numberToSend)
{
    String garmentSizes = "&garment["+garmentNumber+"][sizes]["+size+"]="+numberToSend;
    return garmentSizes;
}

我正在尝试弄清楚如何使用更少的代码来完成此任务。我读过,通过函数式编程,您可以执行诸如将函数传递给其他函数的参数之类的操作。在网上阅读了一些内容后,我想我想做这样的事情,但我不确定最好的方法是什么。

我在这里阅读了一些有关堆栈溢出的内容,并且看到人们提到使用命令模式、FunctionalJava 或 LambdaJ 来尝试在 Java 中近似此功能。我已经阅读了这两个库的文档并阅读了有关命令模式的维基百科文章,但我仍然不确定如何使用其中任何一个来解决我的特定问题。有人可以向我解释一下吗?作为一个从未做过任何函数式编程的人,这有点令人困惑。

最佳答案

  • 您可以使用局部变量来减少重复次数。例如,bySize = dresss.get(i).getSizes().get(j)
  • 您可以使用枚举来获取尺寸并循环使用尺寸,而不是 size.getXxsml()size.getXsml() 等。

整个事情看起来像:

for(int j=0;j<garments.get(i).getSizes().size();j++) {
    bySize = garments.get(i).getSizes().get(j);
    for (Size s : Size.values()) {
        if (bySize.get(s) > 0)  {
            garmentString.append(garmentSizes(i, s, bySize.get(s)));
        }
    }
}

bySize.get(s) 方法可以通过指向正确方法的开关来实现,也可以直接在枚举中实现,并且您可以摆脱 getXsml 等等方法。

关于java - 如何使用函数式编程来进行字符串操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652723/

相关文章:

java - 我的整数列表在哪里变成了可选<Integer>列表?

asp.net-mvc - MvcContrib.CommandProcessor.RulesEngine 教程

java - 为什么在 GWT(或任何网络应用程序)中使用命令模式?

c# - 公开可用操作的正确模式

java - XML 数据类型规范

javascript - 在 python 或 javascript 中正确使用 fold 或 reduce 函数来处理从长到宽的数据?

java - 如何根据对象变量值的独特性将对象排序/分组到列表中?

functional-programming - 在 OCaml 中更改相同类型

java - 尝试使用 Amazon Product Affiliate API 时出错

java - 重载继承类型的参数