簡體   English   中英

如何使用函數式編程進行字符串操作?

[英]How can I use functional programming to do string manipulation?

我正在編寫一個函數,實際上我要一遍又一遍地做同樣的事情。 我有下面列出的功能

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


        }
    }
}

這是我的clothingSizes函數:

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

我試圖弄清楚如何用更少的代碼來完成這項工作。 我已經讀過,通過函數式編程,您可以執行諸如將函數傳遞給其他函數的參數之類的事情。 在上網閱讀后,我想我想做這樣的事情,但是我不確定最好的方法是什么或什么方法。

我在這里做了一些有關堆棧溢出的閱讀,而且我看到有人提到使用命令模式或FunctionalJava或LambdaJ來嘗試在Java中近似此功能。 我已經閱讀了這兩個庫的文檔,並閱讀了有關命令模式的Wikipedia文章,但是我仍然不確定如何使用這些方法來解決我的特定問題。 有人可以向我解釋嗎? 由於從未進行過任何函數式編程的人對此有些困惑。

  • 您可以使用局部變量來減少重復次數。 例如說bySize = garments.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等方法。

所有檢查之間唯一不同的是:

getXxsml/xxsml, getXsml/xsml, getSml/sml, etc.

如果可以將這些值(作為字符串)傳遞給某些上層方法,以及
該上層方法可以評估,即執行這些字符串,那么您可以
具有這些值的數組,並將該數組傳遞給該上層方法。

在Java中,您可以使用反射執行類似的操作。
所有這些檢查確實可以簡化為更少
通過使用反射代碼。

看着:
java.lang.Class
java.lang.reflect.Method
java.lang.reflect.Field
java.lang.reflect.Constructor
你會明白我的意思的。

從您的代碼看來,某些類具有以下方法:

 xxsml(), xsml(), sml(), med(), ..., xxxlg()

獲取每種尺寸的可用量(?)。

您可以更好地設計數據,如下所示:

  • 具有“大小”類型,該類型會枚舉所有大小(可以是Enum或具有屬性String key某些類)
  • 有一個方法可以返回所有已知大小的列表。
  • 將上述方法替換為amountFor(Size)可以由Map<Size, Integer>

為了向后兼容,您可以按照以下方式重寫舊方法:

int xxsml() {
    return amountFor(Size.XXSML);  // assuming you have a singleton instance
                                   // for each well known size
}

當然,在getGarmentString中,然后將遍歷所有已知大小的List:

for (Size sz : Size.getAllKnownSizes()) {
    if (garments.get(i).getSizes().get(j).amountFor(sz) > 0) {
          ... do whatever must be done here
    }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM