首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAVA:如何获得流max的最大时间戳?

JAVA:如何获得流max的最大时间戳?
EN

Stack Overflow用户
提问于 2022-09-27 03:02:58
回答 1查看 194关注 0票数 -1

我有一个时间戳列表,我需要得到最新的时间戳。

下面的解决方案可以在我们的系统更新的环境中工作,但是不适用于旧的环境。旧环境的编译器不接受方法引用"::“of max()。

代码语言:javascript
复制
var latestTimestamp = timestamps.stream().max(Timestamp::compareTo);

有没有其他不使用“:”的替代方法?

EN

回答 1

Stack Overflow用户

发布于 2022-09-27 03:52:41

tl;dr

代码语言:javascript
复制
timestamps.isEmpty() ? null : Collections.max( timestamps )

Java 7及更早版本的完整示例:

代码语言:javascript
复制
List < Timestamp > timestamps = new ArrayList <>();
timestamps.add( Timestamp.valueOf( "2023-01-23 12:00:00" ) );
timestamps.add( Timestamp.valueOf( "2023-01-23 23:00:00" ) );
timestamps.add( Timestamp.valueOf( "2023-01-23 01:00:00" ) );

Timestamp latestTimestamp = timestamps.isEmpty() ? null : Collections.max( timestamps );

2023-01-23 :00:00.0

详细信息

让我们来做一些示例数据。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "Africa/Tunis" );
LocalDate ld = LocalDate.of( 2023 , Month.JANUARY , 23 );
List < Timestamp > timestamps = List.of(
        Timestamp.from( ZonedDateTime.of( ld , LocalTime.MAX , z ).toInstant() ) , // Convert from modern class to legacy class.
        Timestamp.from( ZonedDateTime.of( ld , LocalTime.MIN , z ).toInstant() ) ,
        Timestamp.from( ZonedDateTime.of( ld , LocalTime.NOON , z ).toInstant() )
);

timestamps.toString() = 2023-01-23 14:59:59.999999999,2023-01-22 15:00:00.0,2023-01-23 03:00:00.0

Java 8+,streams & lambdas

Java 8带来了主要的新特性,包括lambda、streams、方法引用和var。让我们用这些。

代码语言:javascript
复制
var latestTimestamp = timestamps.stream().max( Timestamp :: compareTo );

看这个在Ideone.com现场运行的代码

latestTimestamp.toString() = Optional2023-01-23 14:59:59.999999999

Java 8+,传统风格

我们可以把代码转换成传统的风格。您的IDE (如IntelliJ )可能提供自动转换。

这是IntelliJ 2022.3为我转换的结果。

代码语言:javascript
复制
boolean seen = false;
Timestamp best = null;
for ( Timestamp timestamp : timestamps )
{
    if ( ! seen || timestamp.compareTo( best ) > 0 )
    {
        seen = true;
        best = timestamp;
    }
}
var latestTimestamp = seen ? Optional.of( best ) : Optional. < Timestamp > empty();

var是Java 9+中的新版本。对于Java8,用Timestamp声明替换。

运行时,结果相同。

latestTimestamp = 2023-01-23 14:59:59.999999999

在Java 8之前

我们可以在Java 8之前进一步修改该代码,Java 7和更早版本既不支持Optional也不支持var

代码语言:javascript
复制
boolean seen = false;
Timestamp best = null;
for ( Timestamp timestamp : timestamps )
{
    if ( ! seen || timestamp.compareTo( best ) > 0 )
    {
        seen = true;
        best = timestamp;
    }
}
Timestamp latestTimestamp = best;

作为霍格评论,我们甚至可以在早期版本的Java中进一步简化。

使用Collections.max查找自然秩序中最大的。

用这个衬里替换上面看到的整个块。三元算子 (?:)是if- compact语句的一个紧凑的替代方法。

代码语言:javascript
复制
Timestamp latestTimestamp = timestamps.isEmpty() ? null : Collections.max( timestamps );

顺便说一句,您使用的是几年前被JSR 310中定义的现代java.time类取代的糟糕的日期时间类。

要表示从UTC到UTC的偏移量为0小时-分-秒的时刻,请使用java.time.Instant

要表示通过JDBC4.2及更高版本与数据库系统交换的时间,请将java.time.OffsetDateTime用于类似于Standard的TIMESTAMP WITH TIME ZONE类型的列。

对于Java6和Java7,将ThreeTen库添加到您的项目中,以获得大部分java.time功能。但是这些版本的Java已经过了很长时间了;考虑升级到LTS版本的Java: 8、11或17。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73861923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档