Привет! Меня зовут Диана, и я занимаюсь разработкой с 2013. Здесь пишу просто и понятно про джава бэк
🔥Тот самый курс по многопочке🔥
https://fillthegaps.ru/mt
Комплименты, вопросы, предложения: @utki_letyat
Post #562
9.95K
- 👍 15
- ❤ 4
- 🔥 4
JA @java_fillthegaps
Showing posts older than #563 · Back to latest
record Point(int x, int y) { }
Point p1 = new Point(1,1);Point p2 = new Point(p1.x()*2, p1.y());
Point p2 = p1.withX(p1.x()*2);
Point p3 = p1.withX(p1.x() - 5);
Point p4 = p1 with {
x *= 2;
y *= 2;
};
Optional — супер удобный инструмент, который появился в java 8. В документации его цель явно обозначена — показать, что результат вызова метода может отсутствовать.Optional:Optional<String> search();
Optional часто используется некорректно, код получается сложным или плохо читаемым. Самые популярные ошибки:❌ void init(Optional<String> value) {…}
void init (String value) {
if (value == null) …
}❌ return Optional.ofNullable(value).orElse("default");
✅ return value == null ? "default" : value;Optiona<String> valueOpt = …
String value = valueOpt.orElse("default");
❌ public Optional<List<Integer>> search(…)
✅ public List<Integer> search(…) {
… return List.of();
}OptionalInt, OptionalDouble и OptionalLong.❌ List<Student> search(Optional<String> city)
❌ void init(Optional<String> conf)
❌ Optional<List<Student>> all()equals и hashcode. За что отвечают, как соотносятся между собой, когда переопределять, а когда не стоит.-XX:+UnlockExperimentalVMOptions -XX:hashCode={число}java.lang.Object@1
java.lang.Object@a4
java.lang.Object@a5
java.lang.Object@a6
buildStringBuilder append можно вызывать сколько угодно разreverse или deleteHttpClient client = HttpClient.newBuilder().build();
SingleFacadeFactory facadeFactory = new SingleFacadeFactory();
HttpClientImpl impl = new HttpClientImpl(builder, facadeFactory);
impl.start();
…
return facadeFactory.facade;
try-with-resources.// общее поле c базовой информацией
Account.Builder accBuilder = Account.builder().INN(…).KPP(…)
// в тесте, где важен БИК:
Account acc = accBuilder.RCBIC(123).build();
// в тесте, где нужно название банка
Acccount acc = accBuilder.bankName("green").build();
build может содержать сложную логику: от проверки параметров до шифрований и преобразованийFluent API — это стиль написания кода. Грубо говоря, когда методы соединяются через точку (method chaining). С помощью Fluent API можно создать объект и проинициализировать поля.Builder — паттерн для создания объектов, суть которого в постепенном накоплении информации. Билдер тоже использует method chaining и относится к fluent api. Account acc = new Account(111, 222, 333);
Account acc = new Account();
acc.setINN(111);
acc.setKPP(222);
acc.setRCBIC(333);
Account acc = Account.new()
.INN(111)
.KPP(222)
.RCBIC(333);
@Accessors(chain = true) упрощает задачуAccount acc = Account.builder().
.INN(111)
.KPP(222)
.RCBIC(333)
.build();
@Builder из ломбокаCompletableFuture.runAsync(…).thenRun(…).exceptionally(…);
assertThat(str).startsWith(…).contains(…);
when(mock.method()).thenReturn(…).thenReturn(…).thenThrow(…);
List<User > users = jdbcClient.sql(…)
.param("rating", 5, Types.INTEGER)
.query(mapper)
.list();
ExampleMatcher matcher = ExampleMatcher.matching()
.withIgnorePaths(…)
.withStringMatcher(StringMatcher.ENDING);
logger.atInfo().log(…);
logger.info(…) короче и удобнееPerson person = new Person().setName(…).setAge(…);
var, текстовые блоки, records, pattern matching, sealed классы, string templates и так далее.clients.stream()
.distinct(Client::getBonusType)
.map(Client::getId).forEach(…)
[1,2,3,4,5,6] → windowFixed(3) → [1,2,3], [4,5,6]
[1,2,3,4,5,6,7] → windowSliding(3) → [1,2,3], [3,4,5], [5,6,7]
list.stream()
.gather(Gatherers.windowFixed(2))
.collect(Collectors.toList())
list.stream()
.windowFixed(2)
.toList()
gather(Gatherers"list.windowed(5,2)
cancel(true), и в чём разница с cancel(false).Future#cancel — наглядная иллюстрация, почему boolean параметры в public методах не ок. Потому что непонятно, что означают true и false.HashMap для методов put(k,v) и putIfAbsent(k,v). Оба в итоге вызывают private метод putVal с флажком ifAbsentenum ReplicateStatus {NO_REPLICATION, REPLICATE};
...
saveRequest(req, ReplicateStatus.REPLICATE);persist/save/merge, использует нужные типы данных и тд.