有一个 Java Gradle 项目。构建任务构建一个名为 artifact-1.0.jar 的项目 jar 文件。每次执行构建任务时,版本都需要更改。例子:
- artifact-1.0-1.jar。
- artifact-1.0-5.jar。
- artifact-1.0-20.jar。
- ...
- artifact-1.0-N.jar。
如何正确实施?
有一个 Java Gradle 项目。构建任务构建一个名为 artifact-1.0.jar 的项目 jar 文件。每次执行构建任务时,版本都需要更改。例子:
如何正确实施?
我想一劳永逸地找出在哈希集合中用作键的更好和更方便的方法String还是UUID?
Map<String, Value> map = ...
Map<UUID, Value> map = ...
实际上有一个单独Runnable的,其中执行一些操作。这个Runnable有一个这些动作的队列。在这些动作的执行之间有一个时间 - timeout,在执行下一个动作之前必须经过。如果队列为空,那么线程应该休眠,但是一旦有新的“任务”添加到队列中,它就Runnable应该唤醒并执行它。我做了一个素描课:
public final class TitleHelper implements Runnable {
private static TitleHelper instance = new TitleHelper();
public static TitleHelper getInstance() {
return instance;
}
private TitleHelper() {
}
private static final Queue<Title> titleQueue = new ArrayDeque<>();
@Override
public void run() {
if (titleQueue.size() > 0) {
Title title = titleQueue.poll();
title.show();
TimeUnit.SECONDS.sleep(title.getShowTime());
} else {
TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
}
}
public void add(Title title) {
titleQueue.offer(title);
//при добавлении нового объекта в очередь на показ нужно разбудить спящий поток выше.
}
}
问题:
我如何正确选择实施方法?它有哪些不足之处以及如何改进?
我也明白ArrayQeque-not safe thread添加和删除()时如何同步,poll以免从另一个线程获得更改异常?
有一定的集合,需要在此基础上进行N次查询。我想将它们组合成一个查询并执行。怎么做才对?
private static final String DELETE_PERMISSION_QUERY = "DELETE FROM `" + TABLE + "` WHERE permission = ? AND server = ?;";
public void deleteExpiredPermissions(Set<Permission> expiredPermissions) {
for (Permission permission : expiredPermissions) {
this.connection = getConnection();
try (PreparedStatement ps = this.connection.prepareStatement(DELETE_PERMISSION_QUERY)) {
ps.setString(1, permission.getPermission());
ps.setString(2, this.server);
ps.executeUpdate();
flushLastExecute();
} catch (SQLException ex) {
this.logger.log(Level.SEVERE, "Could not delete permission: " + permission.getPermission(), ex);
}
}
}
例如,有一个网站 该网站有用户。我需要访问一些用户的页面并获取他们个人资料中显示的一些数据。在java应用程序级别解决这个问题的方法是什么?
我搜索了类似的问题,在大多数情况下,我得到了页面的“下载”并解析它。也许有一些特别的?
Gson 能够完全控制对象的 Serializer 和 Deserializer 阶段。
public class SimpleClassSerializer implements JsonSerializer<SimpleClass>, JsonDeserializer<SimpleClass>
实现这些接口后,我们需要实现序列化和反序列化。问题是,是否可以在数据序列化时对特定参数写注释?我没有找到这样的机会。
例如,我需要检查 中是否有任何数据map,如果存在,则返回,否则从数据库加载。
Map<String, Data> map = Maps.newHashMap();
//Вариант 1
map.containsKey(key) ? map.get(key) : map.put(key, loadFromDatabase(key));
//Вариант 2
Data data = map.get(key);
if (data == null) {
data = map.put(key, loadFormDatabase(key));
}
return data;
那些。问题是什么会更快:在map执行之前初步检查是否存在密钥get,或者立即get检查!= null
用什么比较好?
a > 0
或者
a != 0
在这两种情况下,假设我们对任何事情都不感兴趣,只是数字必须大于零。
这意味着在性能方面,什么更容易做 - 检查更多或不相等?
有一个代码:
System.out.println(Double.MIN_VALUE - 1.0D);
为什么会有结果-1.0?
有Map<String, Warp>。该类Warp有一个方法getVisits();
我需要获得访问量最大的 10 个经纱(getVisits();- 访问次数)。怎么做才对?
我使用 H2 数据库和 MySQL 模式。
有一个要求:
CREATE TABLE `warps` (
`id` INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`creator` varchar(32) NOT NULL,
`world` varchar(32) NOT NULL,
`welcomeMessage` varchar(100) NOT NULL,
`position` TEXT NOT NULL,
`invitedPlayers` TEXT NOT NULL,
`blacklist` TEXT NOT NULL,
`publicAll` boolean NOT NULL,
`visits` int NOT NULL DEFAULT 0
);
有一个代码可以做到这一点:
private void checkTable() {
this.connection = this.getConnection();
try (PreparedStatement ps = this.connection.prepareStatement(CREATE_TABLE_QUERY)) {
ps.execute();
} catch (SQLException ex) {
this.logger.error("Error creating/check table in database.", ex);
}
}
private Connection getConnection() {
try {
if ((this.connection == null) || (this.connection.isClosed())) {
reconnect();
}
} catch (SQLException e) {
logger.error(e.getMessage(), e);
}
return this.connection;
}
private void reconnect() throws SQLException {
if (this.connection != null) {
this.connection.close();
}
this.connection = this.openConnection();
}
private Connection openConnection() throws SQLException {
return DriverManager.getConnection("jdbc:h2://" + this.plugin.getConfDir().toString() + File.separatorChar + "warps" + ";mode=MySQL", "User", "");
}
结果我得到一个错误:
org.h2.jdbc.JdbcSQLException: Синтаксическая ошибка в выражении SQL "CREATE TABLE IF NOT EXISTS ""WARPS"" (""ID"" INT PRIMARY KEY NOT NULL AUTO_INCREMENT[*], ""NAME"" VARCHAR(32) NOT NULL, ""CREATOR"" VARCHAR(32) NOT NULL, ""WORLD"" VARCHAR(32) NOT NULL, ""WELCOMEMESSAGE"" VARCHAR(100) NOT NULL, ""POSITION"" TEXT NOT NULL, ""INVITEDPLAYERS"" TEXT NOT NULL, ""BLACKLIST"" TEXT NOT NULL, ""PUBLICALL"" BOOLEAN NOT NULL,""VISITS"" INT NOT NULL DEFAULT 0); "; ожидалось "CHECK, REFERENCES, ,, )"
Syntax error in SQL statement "CREATE TABLE IF NOT EXISTS ""WARPS"" (""ID"" INT PRIMARY KEY NOT NULL AUTO_INCREMENT[*], ""NAME"" VARCHAR(32) NOT NULL, ""CREATOR"" VARCHAR(32) NOT NULL, ""WORLD"" VARCHAR(32) NOT NULL, ""WELCOMEMESSAGE"" VARCHAR(100) NOT NULL, ""POSITION"" TEXT NOT NULL, ""INVITEDPLAYERS"" TEXT NOT NULL, ""BLACKLIST"" TEXT NOT NULL, ""PUBLICALL"" BOOLEAN NOT NULL,""VISITS"" INT NOT NULL DEFAULT 0); "; expected "CHECK, REFERENCES, ,, )"; SQL statement:
CREATE TABLE IF NOT EXISTS `warps` (`id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `creator` varchar(32) NOT NULL, `world` varchar(32) NOT NULL, `welcomeMessage` varchar(100) NOT NULL, `position` TEXT NOT NULL, `invitedPlayers` TEXT NOT NULL, `blacklist` TEXT NOT NULL, `publicAll` boolean NOT NULL,`visits` INT NOT NULL DEFAULT 0); [42001-196]
有一个数据库——MySQL。它有一张桌子。我需要在其中一列中存储一个字符串列表。首先想到的是从我的字符串列表中做一个用逗号分隔的字符串,并作为字符串存储在数据库中,当从数据库中接收到时,用逗号分隔,但感觉就像一根拐杖。也许有更好的方法来做到这一点?
我找到了以下代码(工作,经过测试):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace volume_controller
{
public partial class Form1 : Form
{
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int APPCOMMAND_VOLUME_UP = 0xA0000;
private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
private const int WM_APPCOMMAND = 0x319;
[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg,
IntPtr wParam, IntPtr lParam);
public Form1()
{
InitializeComponent();
}
private void Mute()
{
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
(IntPtr)APPCOMMAND_VOLUME_MUTE);
}
private void VolDown()
{
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
(IntPtr)APPCOMMAND_VOLUME_DOWN);
}
private void VolUp()
{
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle,
(IntPtr)APPCOMMAND_VOLUME_UP);
}
}
}
在这里,同样的 VK 用户名是倾斜的。我想知道是否有一些现成的方法可以根据所需和指定的大小写来更改单词?
示例:有一些位置。假设这里是其中之一 - Свалка。
有建议:“在圈子里%locaion%看到了一个敌人。” “它是在%locaion%那时被发现的。”
等等。我们知道,如果我们简单地%location%替换Свалка,而不是占位符,我们就会得到游戏。是否有解决此问题的方法,或者您是否必须为每个(在这种情况下)位置编写每个案例?
例如,有一个使用CURRENT_TIMESTAMPin mysql->生成的日期,String date = "2017-12-20 16:49:31";
我需要将其转换为可以从中提取该日期转换发生那一刻的 UNIX 时间的东西。我翻遍了一个外国论坛,但他们在那里整理出不同的日期格式,我不知道在哪里进一步挖掘。
继续这个话题!这里有张桌子:
CREATE TABLE IF NOT EXISTS `TABLE_KITS_LOG` (
`FIELD_SERVER_ID` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_PLAYER` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_KIT_NAME` varchar(64) COLLATE utf8_unicode_ci,
`FIELD_TIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
它有一个索引:
CREATE unique index TABLE_KITS_LOG_INDEX on TABLE_KITS_LOG(
FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME);
例如,该表具有以下条目:
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "deluxe");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "mods");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("rpg", "name", "vip");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "deluxe");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "mods");
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME) VALUES ("classic", "name", "vip");
由于更改只需要一个字段,因此FIELD_TIMESTAMP我尝试使用唯一索引和表设置进行查询,该查询将自行更新此字段,因为在创建表时,我default在更新时指定了值和值CURRENT_TIMESTAMP。
由于我指出更新记录时,列 FIELD_TIMESTAMP应该更新自己,我不知道后面写什么KEY UPDATE,在下面的变体中,写了一个错误:Error Code: 1136. Column count doesn't match value count at row 1。需要注意的是,如果没有记录,则必须插入,如果有,则更新时间。
尝试提出正确的请求:
INSERT INTO `TABLE_KITS_LOG` (FIELD_SERVER_ID, FIELD_PLAYER, FIELD_KIT_NAME, FIELD_TIMESTAMP) VALUES ("rpg", "name", "mods")
ON DUPLICATE KEY UPDATE FIELD_TIMESTAMP = CURRENT_TIMESTAMP;
@Akina 帮助
让我们假设有一个特定的方法,比如说,3 个参数。
public void something(final String id, final String name, final Entity entity){
//...
}
在这种情况下,所有参数都标记为最终参数。那些。我确定我不会更改它们,而只会使用它们的值。上面描述的 + 和 - 是什么。我应该在方法参数中写“final”这个词吗?在优化方面是否有意义?
有代码(Java 7):
Set<Session> set = new HashSet<>();
for (Session session : this.sessions.values()) { // sessions -> HashMap<String, Session>
if (session.isSavingRequired()) {
session.setSavingRequired(false);
set.add(session);
}
}
如何将上述代码转换为 java 8 变体?我试过这样:
Set<Session> set = this.sessions.values()
.stream()
.filter(Session::isSavingRequired)
.collect(Collectors.toSet());
问题是在上面的代码中,我遗漏了一行session.setSavingRequired(false);,这不好。怎么做才对?
这里有张桌子。如果它不存在,我需要在其中插入一行,或者如果条目已经存在,则更新它。
到目前为止,我正在这样做:我正在尝试获取其中一个字段所需的数据,然后检查是否返回了任何内容,如果有,则更新它,如果没有,则创建一条新记录.