Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //package org.acmsl.pocs.lambdafor;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.List;
  5. import java.util.function.Function;
  6. import java.util.stream.Collectors;
  7. public class ControlFlow
  8. {
  9. public <C extends Collection<I>, I, R> Collection<R> forloop( final C items, final Function<I, R> lambda)
  10. {
  11. return functionalForLoop(items, lambda);
  12. }
  13. public <C extends Collection<I>, I, R> Collection<R> functionalForLoop( final C items, final Function<I, R> lambda)
  14. {
  15. return items.stream().map(lambda::apply).collect(Collectors.toList());
  16. }
  17. public Collection iterativeForloop( final Collection items, final Function lambda)
  18. {
  19. final List<Object> result = new ArrayList<>();
  20. for (final Object item: items)
  21. {
  22. result.add(lambda.<Object>apply(item));
  23. }
  24. return result;
  25. }
  26. public <C extends Collection<I>, I, R> Collection<R> externallyDrivenForloop(
  27. final ControlFlowDriver driver, final C items, final Function<I, R> lambda)
  28. {
  29. final List<R> result = new ArrayList<>(items.size());
  30. final List<I> list = new ArrayList<>(items);
  31. int position = -1;
  32. while (true)
  33. {
  34. ControlFlowCommand command = driver.waitForCommand();
  35. switch (command)
  36. {
  37. case NEXT:
  38. position++;
  39. break;
  40. case PREVIOUS:
  41. position++;
  42. break;
  43. case RELOAD:
  44. break;
  45. default:
  46. break;
  47. }
  48. if (position < 0)
  49. {
  50. position = 0;
  51. }
  52. else if (position > list.size() - 1)
  53. {
  54. break;
  55. }
  56. result.set(position, lambda.apply(list.get(position)));
  57. }
  58. return result;
  59. }
  60. }