2015-03-26 3 views
0

Я пытаюсь обновить свойство bean (если оно удовлетворяет условию), итерации над его списком. Для повышения производительности Я использую Lists.transformКак обновить bean во время итерации

private void populate(final WorkFlowDataBean workFlowDataBean, final List<ApplicationDataBean> items) { 
     Lists.transform(items, new Function<ApplicationDataBean, ApplicationDataBean>() { 
      @Override 
      public ApplicationDataBean apply(ApplicationDataBean input) { 
       if (String.valueOf(workFlowDataBean.getId().intValue()).equalsIgnoreCase(String.valueOf(input.getWorkflowId().intValue()))) { 
        input.setWorkflowName(workFlowDataBean.getName()); 
        input.setWorkflowVersion(workFlowDataBean.getVersion()); 
        logger.info("---finally----"); 
       } 
       logger.info(String.valueOf(workFlowDataBean.getId().intValue()) + "===" + String.valueOf(input.getWorkflowId().intValue())); 
       return input; 
      } 
     }); 

    } 

Я не могу использовать цикл Еогеасп, как это будет замедлять мое заявление.

+1

Не работает ли оно для вас? Здесь нет очевидного вопроса. –

+0

no :(Я все еще застрял здесь –

+2

Извините, я не понимаю проблему. List.transform() в любом случае нуждается в повторении по списку. Функциональные идиомы Гуавы должны использоваться для улучшения беглости или удобочитаемости; «t обязательно (когда-либо?) улучшает производительность по сравнению с обычным императивом для цикла. Какая ошибка вы получаете? –

ответ

2

Lists.transform() фактически возвращает лениво-вычисленный вид списка, а это значит, что все, что у вас есть в apply(), происходит только при запуске итерации преобразованной коллекции. Таким образом, вы не можете использовать метод так, как вы его используете сейчас, потому что apply() никогда не вызывается, если вы не используете преобразованный список ни для чего.

Для работы вокруг проблемы вы могли бы попытаться создать новый список (который вы отбрасывать) на основе преобразованной коллекции:

Lists.newArrayList(Lists.transform(
    /*Your transformation code*/ 
)); 

Более длительный срок решение будет заново продумать метод в целом. То есть, вы должны просто использовать цикл for-each в методе и не переносить код в функцию. Нормальный, императивный код будет легче читать и в этом случае лучше работать.

+0

Спасибо ... Я пробовал в режиме отладки eclipse. Странная вещь происходит. Когда я отлаживаю его по строкам, мои бобы заполняются, и я получаю желаемый результат. Но, когда я запускаю его за один раз, не происходит ни одной популяции. –

3

«Я не могу использовать цикл foreach, поскольку он замедляет мое приложение», здесь просто неправильно. Попытка использовать Lists.transform вам совсем не поможет, потому что A) она не делает то, что вы, кажется, думаете, что она делает, B) это не правильный способ делать то, что вы пытаетесь сделать (для каждого цикла) , и C) вы должны перебирать List, возвращенный Lists.transform, который не будет быстрее, чем для каждого цикла. Похоже, вы думаете, что это быстрее, потому что ваш код фактически ничего не делает.

Если вы действительно хотите сделать это быстрее, вы, вероятно, захотите рассмотреть возможность параллелизации операции.

1

Как сообщалось, возвращенный List не является фактически преобразованным списком, а имеет вид оригинала List, который при повторном последующем применении будет применять преобразование к каждому элементу.

Относительно ошибки вам необходимо вернуть преобразованный список. Вот почему ваш код не работает:

private List<ApplicationDataBean> populate(final WorkFlowDataBean workFlowDataBean, final List<ApplicationDataBean> items) { 
    return Lists.transform(items, new Function<ApplicationDataBean, ApplicationDataBean>() { 
     @Override 
     public ApplicationDataBean apply(ApplicationDataBean input) { 
      if (String.valueOf(workFlowDataBean.getId().intValue()).equalsIgnoreCase(
       String.valueOf(input.getWorkflowId().intValue()))) { 
       input.setWorkflowName(workFlowDataBean.getName()); 
       input.setWorkflowVersion(workFlowDataBean.getVersion()); 
       logger.info("---finally----"); 
      } 
      logger.info(String.valueOf(workFlowDataBean.getId().intValue()) + "===" 
       + String.valueOf(input.getWorkflowId().intValue())); 
      return input; 
     } 
    }); 
} 

Затем вызвать этот метод и перебрать возвращаемый список:

List<ApplicationDataBean> filteredTransformedList = populate(workFlowDataBean, items); 

for (ApplicationDataBean bean : filteredTransformedList) { 
    // do useful things with every filtered and transformed bean 
} 

Что касается использования императива против функционального подхода, просто использовать все, что вы считаете лучшим. Преимущество этого псевдофункционального подхода состоит в том, что он применяется лениво, т. Е. Когда возвращаемый список, наконец, повторен. Следует, однако, отметить, что при изменении элемента ApplicationDataBean input элементы в исходном списке также будут изменены.

+0

Спасибо ... Я пробовал в режиме отладки затмения. Странная вещь происходит. Когда я отлаживаю его по строкам, мои бобы заполняются, и я получаю желаемый результат. Но когда я запускаю его за один раз, не происходит популяции. –

+0

@ShrutiRawat. Вы должны назначить возвращаемый список переменной: «List result = populate (workFlowDataBean, items);», а затем перебрать этот возвращенный список. –

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