[英]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()
獲取每種尺寸的可用量(?)。
您可以更好地設計數據,如下所示:
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.