рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдЯреАрдо рдореЗрдВ рдПрдХ рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб рдмреЗрд╣рддрд░ рдЬрд╛рдирддрд╛ рд╣реИ, рдЙрддрдиреА рдмрд╛рд░ рд╡рд╣ рдЕрдкрдиреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд░рд╣рддрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдХреНрдпрд╛ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рд╣рдорд╛рд░реА рд░рдЪрдирд╛рддреНрдордХрддрд╛ (рдФрд░ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛) рдХреА рдЬреНрд╡рд▓рдВрдд рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
рддреБрд▓рдирд╛рдХрд╛рд░рдХ
рдПрдХ рдХреЛрдб рд╣реИ:
@Getter class Dto { private Long id; }
рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реАрдзреЗ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рддреБрд▓рдирд┐рддреНрд░ рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ Comparator::compare
рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди Comparator::compare
рд╡рд┐рдзрд┐ рд╕рдлреЗрдж рдореЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ:
рдЖрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рджреЛ рддрд░реНрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ, рд╢реВрдиреНрдп рдпрд╛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо, рдмрд░рд╛рдмрд░ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдпрд╣ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдмрд╣реБрдд рджреВрд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдХрдИ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рддреБрд▓рдирд┐рддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
List<Long> readSortedIds(List<Dto> list) { List<Long> ids = list.stream().map(Dto::getId).collect(Collectors.toList()); ids.sort(Comparator.naturalOrder()); return ids; }
рдЗрд╕реА рддрд░рд╣, рдпрд╣ рдХреЛрдб
List<Dto> sortDtosById(List<Dto> list) { list.sort(new Comparator<Dto>() { public int compare(Dto o1, Dto o2) { if (o1.getId() < o2.getId()) return -1; if (o1.getId() > o2.getId()) return 1; return 0; } }); return list; }
рдХрд▓рд╛рдИ рдХрд╛ рдПрдХ рдЭрдЯрдХрд╛ рдХреЗ рд╕рд╛рде рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
List<Dto> sortDtosById(List<Dto> list) { list.sort(Comparator.comparing(Dto::getId)); return list; }
рд╡реИрд╕реЗ, "рд╡рд┐рдЪрд╛рд░" рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:
рд╡реИрдХрд▓реНрдкрд┐рдХ рджреБрд░реБрдкрдпреЛрдЧ
рд╢рд╛рдпрдж рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрд╛:
List<UserEntity> getUsersForGroup(Long groupId) { Optional<Long> optional = Optional.ofNullable(groupId); if (optional.isPresent()) { return userRepository.findUsersByGroup(optional.get()); } return Collections.emptyList(); }
рдЕрдХреНрд╕рд░, рдореВрд▓реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП Optional
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЧрд╛рд▓реА рдмрд╛рдБрдзреЛ рдФрд░ рдЖрд╕рд╛рди рд▓рд┐рдЦреЛ:
List<UserEntity> getUsersForGroup(Long groupId) { if (groupId == null) { return Collections.emptyList(); } return userRepository.findUsersByGroup(groupId); }
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ Optional
рд╡рд┐рдзрд┐ рддрд░реНрдХ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдХреНрд░рдорд╛рдВрдХрди рд╕рдорд░реНрдерди рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╢реВрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИрдВ
рдЗрд╕ рддрд░рд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЛ:
@Component @RequiredArgsConstructor public class ContractUpdater { private final ContractRepository repository; @Transactional public void updateContractById(Long contractId, Dto contractDto) { Contract contract = repository.findOne(contractId); contract.setValue(contractDto.getValue()); repository.save(contract); } }
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдиреЗ рдХрдИ рдмрд╛рд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рджреЗрдЦрд╛ рдФрд░ рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдЗрдХрд╛рдИ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рддрд░реАрдХреЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, org.springframework.data.jpa.repository.JpaRepository::save
рдФрд░ javax.persistence.EntityManager::merge
рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдПрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЕрдиреБрдмрдВрдз рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЗрд╕реЗ update
рд╡рд┐рдзрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ:
@Transactional public void anotherMethod(Long contractId, Dto contractDto) { updateService.updateContractById(contractId, contractDto); Contract contract = repositoroty.findOne(contractId); doSmth(contract); }
рд╣рд╛рдВ, рд╣рдо рдЗрдХрд╛рдИ рдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓рдХрд░ UpdateService::updateContract
рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
@Component @RequiredArgsConstructor public class ContractUpdater { private final ContractRepository repository; @Transactional public Contract updateContractById(Long contractId, Dto contractDto) { Contract contract = repository.findOne(contractId); contract.setValue(contractDto.getValue()); return repository.save(contract); } }
рдПрдХ рдУрд░, рдпрд╣ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, void
рддрд░реАрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдПрдХ рдмреЗрд╣рдж рд╣реА рдбрд░рд╛рд╡рдирд╛ рдХрд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:
@RunWith(MockitoJUnitRunner.class) public class ContractUpdaterTest { @Mock private ContractRepository repository; @InjectMocks private ContractUpdater updater; @Test public void updateContractById() { Dto dto = new Dto(); dto.setValue("- "); Long contractId = 1L; when(repository.findOne(contractId)).thenReturn(new Contract()); updater.updateContractById(contractId, contractDto);
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╡рд┐рдзрд┐ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИ рддреЛ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ @RunWith(MockitoJUnitRunner.class) public class ContractUpdaterTest { @Mock private ContractRepository repository; @InjectMocks private ContractUpdater updater; @Test public void updateContractById() { Dto dto = new Dto(); dto.setValue("- "); Long contractId = 1L; when(repository.findOne(contractId)).thenReturn(new Contract()); Contract updated = updater.updateContractById(contractId, contractDto); assertEquals(dto.getValue(), updated.getValue()); } }
рдПрдХ рдЭрдкрдЯреНрдЯреЗ рдореЗрдВ, рди рдХреЗрд╡рд▓ ContractRepository::save
рдХреЛ рдХреЙрд▓ ContractRepository::save
рдЬрд╛рдБрдЪ рдХреА ContractRepository::save
рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рд╣реЗрдЬреЗ рдЧрдП рдореВрд▓реНрдп рдХреА рд╢реБрджреНрдзрддрд╛ рднреАред
рд╕рд╛рдЗрдХрд┐рд▓ рдирд┐рд░реНрдорд╛рдг
рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:
lastIndexOf('.')
рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
String fileExtension = fileName.subString(fileName.lastIndexOf('.'));
рдпрд╣реА рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдирдИ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХреА рдЧрдИ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╕рдЬреНрдЬрдиреЛрдВ, рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдирд╛рдо / рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдпрд╛ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛ / рдХреЙрдкреА рдХрд░рдирд╛, рддреЛ 10 рдореЗрдВ рд╕реЗ 9 рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдп рдЖрдкрдХреЗ рд╕рдордХреНрд╖ рдкрд╣рд▓реЗ рд╣реА рд╣рд▓ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдЗрдХрд┐рд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЯрд╛рдИ рдХрд░реЗрдВ рдФрд░ рддреИрдпрд╛рд░ (рдФрд░ рд╕рд┐рджреНрдз) рд╕рдорд╛рдзрд╛рди рд▓реЗрдВ:
import org.apache.commons.io.FilenameUtils;
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЙрд╕ рд╕рдордп рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдмрд╛рдЗрдХ рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг FilenameUtils::getExtension
)ред
рдпрд╛ рдпрд╣рд╛рдБ рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ:
try { FileChannel sc = new FileInputStream(src).getChannel(); FileChannel dc = new FileOutputStream(new File(targetName)).getChannel(); sc.transferTo(0, sc.size(), dc); dc.close(); sc.close(); } catch (IOException ex) { log.error("", ex); }
рдХреНрдпрд╛ рд╣рд╛рд▓рд╛рдд рд╣рдореЗрдВ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрдирдореЗрдВ рд╕реЗ рд╣рдЬрд╛рд░реЛрдВ:
- рдЧрдВрддрд╡реНрдп рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ
- рд╕реНрд░реЛрдд рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
- рд╕реНрд░реЛрдд рдФрд░ рдЧрдВрддрд╡реНрдп рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ
- рдЧрдВрддрд╡реНрдп рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
- рд╡рдЧреИрд░рд╣ рд╡рдЧреИрд░рд╣ред
рджреБрдГрдЦ рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЗрд▓реНрдл-рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдХрд▓ рдХреЗ рджреМрд░рд╛рди рд╕реАрдЦрддреЗ рд╣реИрдВред
рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдХрд░реЗрдВ
import org.apache.commons.io.FileUtils; try { FileUtils.copyFile(src, new File(targetName)); } catch (IOException ex) { log.error("", ex); }
рддрдм рдЪреЗрдХреЛрдВ рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рдж рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реЛрдЧрд╛ ( FileUtils::copyFile
рдХреЗ рд╕реНрд░реЛрдд FileUtils::copyFile
)ред
@ рдиреБрд▓реНрд▓реЗрдмрд▓ / @ рдиреЛрдЯрдирд▓ рдХреА рдЙрдкреЗрдХреНрд╖рд╛
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдХрд╛рдИ рд╣реИ:
@Entity @Getter public class UserEntity { @Id private Long id; @Column private String email; @Column private String petName; }
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ email
рдХреЙрд▓рдо рдХреЛ рдкреЗрдЯрдиреЗрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, not null
рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд not null
рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдПрдиреЛрдЯреЗрд╢рди рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import javax.annotation.Nullable; import javax.annotation.NotNull;
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕рдВрдХреЗрдд рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИред рдЗрд╕реА рд╕рдордп, рдпреЗ рдПрдиреЛрдЯреЗрд╢рди рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реЗрдмрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐, рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
boolean checkIfPetBelongsToUser(UserEnity user, String lostPetName) { return user.getPetName().equals(lostPetName); }
рддрдм "рдЖрдЗрдбрд┐рдпрд╛" рд╣рдореЗрдВ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЦрддрд░реЗ рд╕реЗ рдЖрдЧрд╛рд╣ рдХрд░реЗрдЧрд╛:
рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди 'рдмрд░рд╛рдмрд░' 'NullPointerException' рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдХреЛрдб рдореЗрдВ
boolean hasEmail(UserEnity user) { boolean hasEmail = user.getEmail() == null; return hasEmail; }
рдПрдХ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдЧреА:
рд╣рд╛рд▓рдд 'user.getEmail () == рдЕрд╢рдХреНрдд' рд╣рдореЗрд╢рд╛ 'рдЭреВрдареА' рд╣реИ
рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрдВрд╕рд░ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдПрдиреЛрдЯреЗрд╢рди рдЙрди рддрд░реАрдХреЛрдВ рдкрд░ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдореВрд▓реНрдп рдФрд░ рдЙрдирдХреЗ рддрд░реНрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдореЗрд░реЗ рддрд░реНрдХ рдЕрдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рднреА рдЧрдВрднреАрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ, рд╡рд╣реА "рд╕реНрдкреНрд░рд┐рдВрдЧ" - рд╡реЗ рдХреНрд░рд┐рд╕рдорд╕ рдЯреНрд░реА рдХреА рддрд░рд╣ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд▓рдЯрдХреЗ рд╣реБрдП рд╣реИрдВред рдФрд░ рдпрд╣ рдПрдХ рд╕рдирдХреА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЧрдВрднреАрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХрдорд╛рддреНрд░ рджреЛрд╖, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдзреБрдирд┐рдХ рд░рд╛рдЬреНрдп рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЖрд╢реАрд░реНрд╡рд╛рдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдХреЛрдб рдкрд░ рд▓реМрдЯрдиреЗ рд╕реЗ рд╣рдо рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдФрд░ рдмреЗрд╣рддрд░ рд╕рдордЭрддреЗ рд╣реИрдВред
рдЖрдирд╛рдХрд╛рдиреА
рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ:
Collection<Dto> dtos = getDtos(); Stream.of(1,2,3,4,5) .filter(id -> { List<Integer> ids = dtos.stream().map(Dto::getId).collect(toList()); return ids.contains(id); }) .collect(toList());
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЪрд╛рдмрд┐рдпреЛрдВ рдХреА рдПрдХ рдирдИ рд╕реВрдЪреА рдХреНрдпреЛрдВ рдмрдирд╛рдИ рдЬрд╛рдП рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдзрд╛рд░рд╛ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╕рдордп рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ 5 рддрддреНрд╡ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЙрдирдореЗрдВ рд╕реЗ 100500 рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдФрд░ рдЕрдЧрд░ getDtos
рд╡рд┐рдзрд┐ 100500 рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рд╕реВрдЪреА рдореЗрдВ!) рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реЛрдЧрд╛? рдХреЛрдИ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рдмреЗрд╣рддрд░ рд╣реИ:
Collection<Dto> dtos = getDtos(); Set<Integer> ids = dtos.stream().map(Dto::getId).collect(toSet()); Stream.of(1,2,3,4,5) .filter(ids::contains) .collect(toList());
рдпрд╣рд╛рдБ рднреА:
static <T, Q extends Query> void setParams( Map<String, Collection<T>> paramMap, Set<String> notReplacedParams, Q query) { notReplacedParams.stream() .filter(param -> paramMap.keySet().contains(param)) .forEach(param -> query.setParameter(param, paramMap.get(param))); }
рдЬрд╛рд╣рд┐рд░ рд╣реИ, inParameterMap.keySet()
рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЪрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
static <T, Q extends Query> void setParams( Map<String, Collection<T>> paramMap, Set<String> notReplacedParams, Q query) { Set<String> params = paramMap.keySet(); notReplacedParams.stream() .filter(params::contains) .forEach(param -> query.setParameter(param, paramMap.get(param))); }
рд╡реИрд╕реЗ, рдРрд╕реЗ рдЦрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ 'рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реВрдк рдЗрди рд▓реВрдк' рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЬрдм рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢рдХреНрддрд┐рд╣реАрди рд╣реЛрддрд╛ рд╣реИ
рдЖрдард╡реЗрдВ рдЬрд╛рд╡рд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдорд░ рдЪреБрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рдкреНрд░реЗрдо рдзрд╛рд░рд╛рдПрдВ рд╣реИрдВред рд╣рдо рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрдиреНрд╣реЗрдВ рдЗрддрдирд╛ рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ:
public Optional<EmailAdresses> getUserEmails() { Stream<UserEntity> users = getUsers().stream(); if (users.count() == 0) { return Optional.empty(); } return users.findAny(); }
рд╕реНрдЯреНрд░реАрдо, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рддрд╛рдЬрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ users
рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдПрдХ IllegalStateException
ред
рд╕реНрдЯреЗрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрднреА рддрдХ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╕рдореАрдХреНрд╖рдХ рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рд╕рдордп рдкрд░ рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред
рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк Stream
рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдирд╛, рдПрдХ рдорд╛рдЗрдирдлреАрд▓реНрдб рдореЗрдВ рдЪрд▓рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд╢рд╛рдпрдж рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИ, рд╢рд╛рдпрдж рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо: рдХреЛрдб рдореЗрдВ Stream<T>
рдХреА рдХрд┐рд╕реА рднреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдХрдЯ рдЖрдЙрдЯ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ)ред
рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░
рдХрдИ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ boolean
, int
, рдЖрджрд┐ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ not null
ред рдпрджрд┐ рдХрд┐рд╕реА рдЗрдХрд╛рдИ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдПрдХ рд╕реНрддрдВрдн рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ not null
рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ int
рдмрдЬрд╛рдп int
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЙрдореНрдмреЛ рд╣реИ - рдФрд░ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХрдо рд╣реИ, рдФрд░ null
рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╡рд╣ рд╕рдм рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЕрдВрддрд┐рдо рд╕рддреНрдп рдирд╣реАрдВ рд╣реИ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд┐рд░ рдХреЗ рд╕рд╛рде рд╕реЛрдЪреЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА рд╕рд▓рд╛рд╣ рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд╕рд╛рд░реНрдердХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд░реЗрдВред