我需要转换java.util.Date到String的yyyy-MM-dd格式在一个大的数额.
我刚刚转到java 8并想知道如何正确地做到这一点.我使用Java 7的解决方案如下:
DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)
DATE_FORMATTER.print(value.getTime())
Run Code Online (Sandbox Code Playgroud)
它帮助我不创建大量冗余对象.
所以现在当我转到java 8时,我想要正确地重写它,但是:
LocalDate.fromDateFields(value).toString())
Run Code Online (Sandbox Code Playgroud)
每次都创建新LocalDate对象,这为GC提供了大量的工作.
有什么方法可以解决我的问题吗?性能和线程安全非常重要.
经过一些测试后,我发现即使创建新的对象构造:
new SimpleDateFormat("yyyy-MM-dd")).format(value))
Run Code Online (Sandbox Code Playgroud)
这个话题最快.
例子:
因此,我需要找到一种方法来告诉 Hibernate“重置其 ids 缓存”,或者换句话说“强制 Hibernate 再次联系 dbms 以获取当前序列值”。
我的代码看起来像:
for (SomeObject object : objects) {
if (object.getSomething() == Something.SomethingHighPriority) {
return object;
}
}
for (SomeObject object : objects) {
if (object.getSomething() == Something.SomethingLowPriority) {
return object;
}
}
Run Code Online (Sandbox Code Playgroud)
它用于通过某种条件获取集合中的第一个元素.此外,优先考虑也很重要.我首先需要寻找一个元素,如果它不存在则寻找第二个元素.
我想用Stream API重写它,但我知道只使用了一次流.现在我用这种方式重写了它,但它似乎比以前更难看.
Optional<SomeObject> object =
objects.stream()
.filter(object -> object.getSomething() == Something.SomethingHighPriority)
.findFirst();
if (object.isPresent()) {
return object.get();
}
object = objects.stream()
.filter(object -> object.getSomething() == Something.SomethingLowPriority)
.findFirst();
// No other use cases
return object.orElse(null);
Run Code Online (Sandbox Code Playgroud)
是否可以减少样板?
我们都知道,因为Java 1.8 PermGen被删除并被Metaspace取代.
我已经阅读了很多关于Metaspace的主题,我完全确定它存在,但今天我被问及有关Oracle JVM规范的参考,其中有关于metaspace的说法,但是使用搜索所有的规范,我找不到任何匹配的单词"元空间".
有人可以与我分享这些信息的链接或告诉我为什么没有找到任何关于它的信息吗?
我必须解决与大的圈复杂度有关的声纳问题,但仍然没有任何好主意如何做到这一点.
代码由大量的"if"运算符组成,这些运算符是方法中的检查参数,并决定要创建的枚举值
这是一个代码片段,例如:
public ProductType createProductType(String val1, String val2, String val3) {
if (PRODUCT_MODEL.equals(val1) && PRODUCT_TYPE.equals(val2) {
return ProductType.SOAP;
}
if (PRODUCT_MODEL.equals(val1) || val3.equals(SWAP)) {
return ProductType.STRING;
}
}
Run Code Online (Sandbox Code Playgroud)
等等..正如你所看到的,我无法用switch case写这个,因为检查了多于1个变量.此外,我无法使用谓词类型的键创建静态映射,因为比较条件动态地来到方法.所以我无法理解如何消除这个'if'运算符.
有什么建议?
编辑
如果将其划分为每种产品类型的方法,那么我将检查何时创建产品类型?我是说我有
ProductType productType = null;
productType = tryParseSoap;
if (Objects.nonNull(productType)) {
return productType;
}
productType = tryParseString;
if (Objects.nonNull(productType)) {
return productType
}
Run Code Online (Sandbox Code Playgroud)
如果这样做我仍然有很多if null检查的情况,因为没有他们建议在第一次检查时创建产品然后我会检查很多次,这是一个很大的生产力减少
客户端可以是能够发送或者String格式
"yyyy-MM-dd HH:mm:ss"或"yyyy-MM-dd"并根据它,我需要或者只是解析满LocalDateTime,如果他给我发了全格式或者创建LocalDateTime具有默认对象Time的一部分"23:59:59"
目前我已经编写了这个解决方案但是因为我使用异常来控制业务逻辑似乎很糟糕.
public class LocalDateTimeConverter implements IStringConverter<LocalDateTime> {
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public LocalDateTime convert(String value) {
LocalDateTime localDateTime;
try {
localDateTime = LocalDateTime.parse(value, DATE_TIME_FORMATTER);
} catch (DateTimeParseException ex) {
localDateTime = LocalDateTime.of(LocalDate.parse(value), LocalTime.of(23, 59, 59));
}
return localDateTime;
}
}
Run Code Online (Sandbox Code Playgroud)
有关如何更清楚地实施它的任何建议?
我遇到一个问题,当我在同一个端口上运行我的应用程序的第二个实例时 - 我得到了 SocketException: java.net.BindException: Address already in use: bind
问题是,在获得此异常后,我的应用程序继续运行.
几个小时后我注意到(使用"获取线程转储"工具)即使在main死亡之后仍有一些线程仍然存在.
我无法访问那些线程,这意味着我无法设计它以便我可以正确地中断它们
而且,thread.interrupt, thread.setDaemon(true), thread.stop- 没有什么帮助我.
如何阻止那些线程?
我正在研究非常大的遗留应用程序和我想要停止的线程是在我无法访问的库中创建的