public void sendCommentToAllClients(Comment comment) {
if (ns != null) {
ns.broadcast("comment:save", comment);
}
}
@PostMapping("/add-comment")
public ResponseEntity<Comment> addComment(@RequestBody BookResponse reqBody, Authentication authentication) {
try {
// (...)
commentRepository.save(comment);
// Отправляем комментарий всем подключенным клиентам
socketEmitter.sendCommentToAllClients(comment);
return ResponseEntity.status(HttpStatus.OK).body(comment);
} catch (Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.build();
}
}
useEffect(() => {
socket.on('comment:save', (data: Comment) => {
const comment = JSON.parse(data as any)
console.log('comment', comment);
props.book.comments.push(comment);
// Если setBookInState обновляет состояние, это может быть полезно для перерисовки
// props.setBookInState({...props.book});
toast.info('Got event from socket: Book ' + comment.text)
});
}, [socket]);
<input>
, значение этого поля не отправляется на сервер вместе с другими данными формы. Таким образом, при отправке формы, поля с атрибутом disabled будут игнорироваться.*{settings[__${item.index}__].name}
установлено как disabled, и поэтому name всегда будет null при обработке POST-запроса на сервере.<td>
<input disabled th:value="*{settings[__${item.index}__].name}">
<input type="hidden" th:field="*{settings[__${item.index}__].name}">
</td>
Scanner input = new Scanner(System.in);
String[] list = new String[4];
System.out.println("Insert list elements: ");
for (int i = 0; i < list.length; i++) {
list[i] = input.nextLine();
}
System.out.print("Inserted list elements: ");
for (String s : list) {
System.out.print(" " + s);
}
System.out.print("Ввод нужного адреса: ");
String address = input.nextLine();
long count = IntStream.range(0, list.length).filter(i -> address.equals(list[i])).count();
System.out.println(count);
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher("string1234(((more56))7))string890");
while (m.find()) {
System.out.println(m.group()); //1234 56 7 890
}
%1$s
и использовать String.format
для замены плейсхолдеров на фактическую строку, которую вам нужно использовать.public class Main {
public static final String DELIMITER = "((?<=%1$s)|(?=%1$s))";
public static void main(String[] args) {
String task = "Заменить, в тексте все! слова длиной? не больше 6 символов; в обратном порядке начинающиеся на: согласную букву ";
String[] arr = task.split(String.format(DELIMITER, "[:?;!. ]"));
String result = Arrays.stream(arr)
.map(s -> !check(s.charAt(0)) && !length(s) ? reverse(s) : s)
.collect(Collectors.joining());
System.out.println(result); /* Заменить, в етскет есв! аволс йонилд? ен ешьлоб 6 символов; в обратном порядке начинающиеся ан: согласную увкуб */
}
public static boolean check(char c) {
return "аиеёоуыэюя".indexOf(c) > -1;
}
public static boolean length(String s) {
return s.length() > 6;
}
public static String reverse(String s) {
return new StringBuilder(s).reverse().toString();
}
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
int[] result = IntStream.rangeClosed(1, array.length)
.map(i -> array[array.length - i])
.toArray();
System.out.println(Arrays.toString(result));
}
public static void main(String[] args) {
Integer[] array = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(array);
Collections.reverse(list);
System.out.println(Arrays.toString(list.toArray()));
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
for (int i = 0; i < array.length / 2; i++) {
int tmp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = tmp;
}
}
Зачем считывать файл через Scanner?
Зачем использовать цикл? нельзя взять и всю прочитать без цикла?
Зачем строке происваевать данные файла?
fromJson
мы сохраняем прочитанные данные, а поскольку JSON представляет собой обычный набор текста, то использование типа String более чем подходит для этой операции. Вы также можете использовать коллекции или массивы для этого.Зачем указывать тип объекта в конце?
fromJson
десериализует JSON, прочитанный из Reader'а (в данном случае из строки) в объект класса, указанного вторым аргументом.static long repeatedString(String s, long n) {
/* Кол-во повторов в исходной строке */
int rep = (int) s.toLowerCase()
.chars()
.filter(c -> c == 'a').count();
/* Кол-во циклов, в которых исходная строка будет полностью скопирована */
long cycles = (n / s.length()) - 1;
/* Кол-во повторов в остаточной строке, которой не хватило на полный цикл */
int remainder = (int) s.toLowerCase()
.substring(0, (int) n % s.length())
.chars()
.filter(c -> c == 'a').count();
return rep * cycles + remainder + rep;
}
String[] array = {"name", "Ivanov", "country", "Ukraine", "city", "Kiev", "age", null};
Map<String, String> map = Stream.iterate(
Arrays.asList(array), list -> list.subList(2, list.size()))
.limit(array.length / 2)
.collect(Collectors.toMap(
list -> list.get(0) == null ? "null" : list.get(0),
list -> list.get(1) == null ? "null" : list.get(1),
(x, y) -> y, LinkedHashMap::new));
map.entrySet().forEach(System.out::println);