2016-09-16 2 views
1

Я пытаюсь изучить Java 8, у меня есть объекты Cat, Food, CurrentState, Endcome и catService, foodService, resultService. Так что мой метод выглядит следующим образомСервисные вызовы Java 8 и функциональные конструкции

public class Cat { 
    private Long ownerId; 
    private Long Id; 

    public Long getOwnerId() { 
     return ownerId; 
    } 

    public void setOwnerId(Long ownerId) { 
     this.ownerId = ownerId; 
    } 

    public Long getId() { 
     return Id; 
    } 

    public void setId(Long id) { 
     Id = id; 
    } 

    public CurrentState findActiveCurrentState() { 
     return new CurrentState(); 
    } 

} 

class CurrentState { 
    Long outcomeId; 

    public Long getOutcomeId() { 
     return outcomeId; 
    } 

    public void setOutcomeId(Long outcomeId) { 
     this.outcomeId = outcomeId; 
    } 

    Outcome findByOutcomeId(Long outcomeId) { 
     return new Outcome(); 
    } 
} 

class Food { 

} 

class Outcome { 
    Long outcomeId; 
    List<String> types; 

    public List<String> getTypes() { 
     types = new ArrayList<>(); 
     types.add("Food"); 
     types.add("Bath"); 
     return types; 
    } 

    public void setTypes(List<String> types) { 
     this.types = types; 
    } 
} 


class CatService { 
    Optional<Cat> findByOwnerId(Long ownerId) { 
     return Optional.of(new Cat()); 
    } 

    public void eatFood(Food food) { 

    } 
} 

class FoodService { 
    Food find(Long catId) { 
     return new Food(); 
    } 

    class FoodEventService { 

     private CatService catService = new CatService(); 

     private FoodService foodService = new FoodService(); 

     public void processCatCanEatFoodEvent(Long ownerId) { 
      Optional<Cat> cat = catService.findByOwnerId(ownerId); 
      if (cat.isPresent()) { 
       //dont worry about the findActiveCurrentState(),its not really important 
       CurrentState currentState = cat.get().findActiveCurrentState(); 
       Food food = foodService.find(cat.get().getId()); 
       Outcome outCome = currentState.findByOutcomeId(currentState.getOutcomeId()); 

       if (outCome.getTypes().contains("Food")) { 
        catService.eatFood(food); 
       } 


      } 
     } 
    } 

} 

я попытался абстрагироваться каждый из этих вызовов служб к функции и затем использовать компоновать и andThen, но не уверен, будет ли он работать или его правильный путь. Поэтому любая помощь будет оценена, поэтому я ищу метод рефакторинга методаCatCanEatFoodEvent. как вы просили в комментарии, обновили класс.

+1

Не имея полного, компилируемого примера для игры, вам очень сложно помочь. Я мог бы рассказать вам кое-что о 'cat.ifPresent (c -> {...}); но я бы не захотел опубликовать код, который я не скомпилировал первым. Риск ошибок слишком велик. –

+0

Обновлено, пожалуйста, см. – user1224036

+0

Почему «CatService» питается едой? Почему 'CurrentState' нуждается в собственном' resultId', переданном себе вызывающим устройством 'findByOutcomeId'? И почему вы хотите «абстрагировать каждый из этих вызовов сервисов на функцию, а затем использовать compose и andThen»? Что вы ожидаете от этого действия? – Holger

ответ

1

Правило большого пальца я узнал о Optional s «никогда не использовать get()». В вашем случае, так как у вас уже есть if заявление, это не так уж трудно найти что-то более изящное:

 cat.ifPresent(c -> { 
      CurrentState currentState = c.findActiveCurrentState(); 
      Food food = foodService.find(c.getId()); 
      Outcome outCome = currentState.findByOutcomeId(currentState.getOutcomeId()); 

      if (outCome.getTypes().contains("Food")) { 
       catService.eatFood(food); 
      } 
     }); 

Для вашего вопроса, после игры вокруг немного, я склонен согласиться с Луи Вассерман, там нет реальная точка во внедрении потребителей, compose() и andThen(). Если вы настаиваете, вы можете сделать это, например:

  if (((Function<Outcome, List<String>>) Outcome::getTypes) 
        .andThen(l -> Boolean.valueOf(l.contains("food"))) 
        .apply(outCome)) { 
       catService.eatFood(food); 
      } 

Не стоит усилий, не так ли?

Смежные вопросы