2016-09-01 42 views
1
public class ShiftPatternDTO{ 
    private boolean monday; 
    private boolean tuesday; 
    private boolean wednesday; 
    private boolean thursday; 
    private boolean friday; 
    private boolean saturday; 
    private boolean sunday; 

    public boolean isMonday() { 
     return monday; 
    } 


    public boolean isTuesday() { 
     return tuesday; 
    } 


    public boolean isWednesday() { 
     return wednesday; 
    } 


    public boolean isThursday() { 
     return thursday; 
    } 



    public boolean isFriday() { 
     return friday; 
    } 


    public boolean isSaturday() { 
     return saturday; 
    } 


    public boolean isSunday() { 
     return sunday; 
    } 
} 

    public enum WeekDay { 

     MONDAY("Monday", 1), 
     TUESDAY("Tuesday", 2), 
     WEDNESDAY("Wednesday", 3), 
     THURSDAY("Thursday", 4), 
     FRIDAY("Friday", 5), 
     SATURDAY("Saturday", 6), 
     SUNDAY("Sunday", 7); 
     } 

    private Set<WeekDay> getWeekPattern(ShiftPatternDTO shiftPattern) { 
      Set<WeekDay> weekPatterns = new LinkedHashSet<>(); 
      if (shiftPattern.isMonday()) { 
       weekPatterns.add(WeekDay.MONDAY); 
      } 
      if (shiftPattern.isTuesday()) { 
       weekPatterns.add(WeekDay.TUESDAY); 
      } 
      if (shiftPattern.isWednesday()) { 
       weekPatterns.add(WeekDay.WEDNESDAY); 
      } 
      if (shiftPattern.isThursday()) { 
       weekPatterns.add(WeekDay.THURSDAY); 
      } 
      if (shiftPattern.isFriday()) { 
       weekPatterns.add(WeekDay.FRIDAY); 
      } 
      if (shiftPattern.isSaturday()) { 
       weekPatterns.add(WeekDay.SATURDAY); 
      } 
      if (shiftPattern.isSunday()) { 
       weekPatterns.add(WeekDay.SUNDAY); 
      } 
      return weekPatterns; 
     } 

條件上面的代碼是用Java 7中我試圖重構這個到Java 8.使用可選實用度過了一段時間,但沒有能夠得出一個書面解決這個問題,請問有人可以幫忙嗎?我不想看到一系列如果條件我的代碼,這是我想要刪除。如何簡化鏈接,如果使用Java 8

我已經給出了我的代碼的基本骨架結構。請注意,問題是非常具體的Java 8,所以一個簡單的答案說不,你需要按照在這個論壇建議的其他選項將被接受

+2

你或許應該使用'EnumSet',而不是'LinkedHashSet'。但是,您認爲Java 8應該如何處理這個問題呢? – RealSkeptic

+0

@RealSkeptic很好,你可以使用像'(ShiftPatternDTO :: isMonday,WeekDay.MONDAY)'這樣的地圖做一個地圖,然後迭代地圖條目。 –

回答

5

如果ShiftPatternDTO應留未修改,用枚舉舉行斷言:

public enum WeekDay { 
    MONDAY("Monday", 1, ShiftPatternDTO::isMonday), 
    TUESDAY("Tuesday", 2, ShiftPatternDTO::isTuesday), 
    WEDNESDAY("Wednesday", 3, ShiftPatternDTO::isWednesday), 
    THURSDAY("Thursday", 4, ShiftPatternDTO::isThursday), 
    FRIDAY("Friday", 5, ShiftPatternDTO::isFriday), 
    SATURDAY("Saturday", 6, ShiftPatternDTO::isSaturday), 
    SUNDAY("Sunday", 7, ShiftPatternDTO::isSunday); 

    public final String name; 
    public final int num; 
    public final Predicate<ShiftPatternDTO> pred; 

    private WeekDay(String name, int num, Predicate<ShiftPatternDTO> pred) { 
     this.name = name; 
     this.num = num; 
     this.pred = pred; 
    } 
} 

private Set<WeekDay> getWeekPatternNew(ShiftPatternDTO shiftPattern) { 
    return 
     Arrays.stream(WeekDay.values()) 
     .filter(wd -> wd.pred.test(shiftPattern)) 
     .collect(Collectors.toSet()); 
} 
+2

與使用LinkedHashSet的原始代碼相比,這不會保持排序。你可以用'Collectors.toCollection(LinkedHashSet :: new)'或者'Collectors.toCollection(( - )EnumSet.noneOf(WeekDay.class))'替換'Collectors.toSet()'。但關於'EnumSet'的巧妙之處在於,它還允許在沒有數組流的情況下使用替代方法:'Set result = EnumSet.allOf(WeekDay.class); result.removeIf(wd - >!wd.pred.test(shiftPattern));返回結果;' – Holger

0

你會更好地重新設計布爾表示的方式。我建議使用Set<WeekDay>

public class ShiftPatternDTO { 

    Set<WeekDay> days = new HashSet<>(); 

    public boolean isDay(WeekDay day) { 
     return days.contains(day); 
    } 

    public void addDay(WeekDay day) { 
     days.add(day); 
    } 

} 

然後,您可以將該套件複製到新套件而不是執行所有這些if語句。

Set<WeekDay> weekPatterns = days.stream().collect(Collectors.toSet());