Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. public static void update(List<Block> blocks, List<BlockDTO> blockDTOs) {
  2. /* REMIND[2017-06-13][Marcus Lin]
  3. * 更新 blocks
  4. * 1. 首先判断 blockDTOs 它们的 id 是否全为空,是的话说明原有的 blocks 被清空了,这些 blockDTOs 便是新增的条目
  5. * 2. 若不为空,则将 blocks 和 blockDTOs 进行比对,以 blockDTOs 的顺序为标准,对 blocks 进行更新及排序,
  6. * 3. 最后,因为以上的排序会导致某几个 blocks 位置变动从而逃过一些判断,故再一次循环,然后移除掉 id 从未匹配到过的 blocks
  7. */
  8.  
  9. if (isIdAllNull(blockDTOs)) {
  10. blocks.clear();
  11. blockDTOs.stream()
  12. .map(BlockUtil::toEntity)
  13. .forEachOrdered(blocks::add);
  14. } else {
  15. List<Long> nonNullIds = new ArrayList<>();
  16. // add new blocks and sort
  17. blockDTOs.forEach(blockDTO -> {
  18. if (blockDTO.getSeq() == null) {
  19. blocks.add(blockDTOs.indexOf(blockDTO), BlockUtil.toEntity(blockDTO));
  20. } else {
  21. nonNullIds.add(blockDTO.getSeq());
  22. int index = blockDTOs.indexOf(blockDTO);
  23. for (int i = 0; i < blocks.size(); i++) {
  24. if (blocks.get(i).getSeq() != null) {
  25. Block block = blocks.get(i);
  26. if (block.getSeq().equals(blockDTO.getSeq())) {
  27. // 如果恰巧下标相同,直接 update, 否则交换位置
  28. if (i == index) {
  29. BlockUtil.mergeToEntity(blockDTO, block);
  30. break;
  31. } else {
  32. Block temp = blocks.get(index);
  33. blocks.set(index, block);
  34. BlockUtil.mergeToEntity(blockDTO, blocks.get(index));
  35. blocks.set(i, temp);
  36. break;
  37. }
  38. }
  39. }
  40. }
  41. }
  42. });
  43. // finally loop again to remove the block whose id that never matched
  44. int removeFlag = 0;
  45. for (int i = 0; i < blocks.size(); i++) {
  46. if (blocks.get(i).getSeq() != null) {
  47. Block block = blocks.get(i);
  48. for (Long id : nonNullIds) {
  49. if (!block.getSeq().equals(id)) {
  50. removeFlag += 1;
  51. } else {
  52. removeFlag = 0;
  53. break;
  54. }
  55. }
  56. }
  57. if (removeFlag == nonNullIds.size()) {
  58. blocks.remove(i);
  59. removeFlag = 0;
  60. }
  61. }
  62. }
  63.  
  64. }
  65.  
  66. private static boolean isIdAllNull(List<BlockDTO> blockDTOS) {
  67. boolean isAllNull = true;
  68. for (BlockDTO blockDTO : blockDTOS) {
  69. if (blockDTO.getSeq() != null) {
  70. isAllNull = false;
  71. break;
  72. }
  73. }
  74. return isAllNull;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement