0

我正在写一个函数,我基本上一遍又一遍地做同样的事情。我已在功能列表如下如何使用函数式编程来进行字符串操作?

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


     } 
    } 
} 

这是我garmentSizes功能:

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

我试图找出如何我能得到这个少了很多代码来完成。我已经阅读过函数式编程,您可以执行诸如将函数传递给其他函数的参数。在网上做一些阅读之后,我想我想要做这样的事情,但我不确定最好的方法是什么或什么。

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

回答

2
  • 你可以使用局部变量来减少重复的量。例如说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的开关等等方法。

+0

谢谢。我从来没有真正想过,但我不知道你可以遍历枚举。 –

1

所有的检查之间不同的唯一事情是这样的:

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

如果你可以通过这些值(字符串)一些上层方法,如果
是上级方法可以EVAL即执行这些字符串,那么你可以
有这些值的数组,该数组传递给上一级方法。

在Java中,你可以用反射类似的东西。
所有这些检查确实可以通过使用反射的简化,以更少
代码。

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

+0

反射是一把双刃剑。它会引入一系列新的危险,甚至会迫使你编写大量的处理invoke错误的异常处理代码。我不认为这样的代码会从中受益。 – tilois

+0

为什么这么多人都如此害怕反思,我不知道。但无论如何,好的,我明白你的观点。一般来说,OP是否决定使用它(在这种情况下),我想他会从这些课程的学习中受益,以及他们可以在这里提供什么。 –

0

从你的代码似乎有些类有以下方法:

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,你然后将通过所有已知尺寸的列表循环:

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