小编Ole*_*nyk的帖子

将java.util.Date转换为yyyy-MM-dd格式的String,而不创建大量对象

我需要转换java.util.DateStringyyyy-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)

这个话题最快.

java java-8 java-time

17
推荐指数
1
解决办法
4014
查看次数

Hibernate重置序列缓存

例子:

  • 假设实体 E 具有由序列 e_seq 生成的 id
  • 假设数据库中sequence的值初始为0,increment配置为50
  • 当hibernate启动时,它获取序列的下一个值(即0+50=50)并保留可用值的内部缓存(即0-50区间内的值)
  • 只要缓存有可用值,就不会再向 dbms 发出请求来获取序列的下一个值
  • 仅当您创建实体 E 的 50 个实例后,才会使用 50 个 id,并且 hibernate 会向 dbms 询问下一个值。
  • 假设 hibernate 缓存还有 50 个可用的 id
  • 假设一个低级过程(如数据迁移)使用 SQL 语句(不使用 hibernate API)在数据库中插入 100 个 E 类型的实体,id 为 1 到 100,然后将序列值重置为 100
  • 如果应用程序尝试从其 API 创建新实体,它将使用从 hibernate 缓存中获取的 id,但该 id 已被低级过程使用,因此导致重复 id 异常

因此,我需要找到一种方法来告诉 Hibernate“重置其 ids 缓存”,或者换句话说“强制 Hibernate 再次联系 dbms 以获取当前序列值”。

java database hibernate

7
推荐指数
2
解决办法
1147
查看次数

Java 8流优先级过滤

我的代码看起来像:

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 java-8 java-stream

5
推荐指数
1
解决办法
653
查看次数

为什么Oracle规范没有告诉任何关于元空间的内容?

我们都知道,因为Java 1.8 PermGen被删除并被Metaspace取代.

我已经阅读了很多关于Metaspace的主题,我完全确定它存在,但今天我被问及有关Oracle JVM规范的参考,其中有关于metaspace的说法,但是使用搜索所有的规范,我找不到任何匹配的单词"元空间".

有人可以与我分享这些信息的链接或告诉我为什么没有找到任何关于它的信息吗?

java jvm permgen metaspace

4
推荐指数
1
解决办法
200
查看次数

减少圈复杂度问题

我必须解决与大的圈复杂度有关的声纳问题,但仍然没有任何好主意如何做到这一点.

代码由大量的"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检查的情况,因为没有他们建议在第一次检查时创建产品然后我会检查很多次,这是一个很大的生产力减少

java sonarqube

2
推荐指数
1
解决办法
194
查看次数

根据输入字符串解析LocalDateTime

客户端可以是能够发送或者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)

有关如何更清楚地实施它的任何建议?

java java-8 java-time

2
推荐指数
1
解决办法
98
查看次数

如何杀死应用程序中由第三方库设计的所有线程

我遇到一个问题,当我在同一个端口上运行我的应用程序的第二个实例时 - 我得到了 SocketException: java.net.BindException: Address already in use: bind

问题是,在获得此异常后,我的应用程序继续运行.

几个小时后我注意到(使用"获取线程转储"工具)即使在main死亡之后仍有一些线程仍然存在.

我无法访问那些线程,这意味着我无法设计它以便我可以正确地中断它们

而且,thread.interrupt, thread.setDaemon(true), thread.stop- 没有什么帮助我.

如何阻止那些线程?

我正在研究非常大的遗留应用程序和我想要停止的线程是在我无法访问的库中创建的

java multithreading

1
推荐指数
1
解决办法
84
查看次数