我有一个时间戳列表,我需要得到最新的时间戳。
下面的解决方案可以在我们的系统更新的环境中工作,但是不适用于旧的环境。旧环境的编译器不接受方法引用"::“of max()。
var latestTimestamp = timestamps.stream().max(Timestamp::compareTo);有没有其他不使用“:”的替代方法?
发布于 2022-09-27 03:52:41
tl;dr
timestamps.isEmpty() ? null : Collections.max( timestamps )Java 7及更早版本的完整示例:
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
详细信息
让我们来做一些示例数据。
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。让我们用这些。
var latestTimestamp = timestamps.stream().max( Timestamp :: compareTo );latestTimestamp.toString() = Optional2023-01-23 14:59:59.999999999
Java 8+,传统风格
我们可以把代码转换成传统的风格。您的IDE (如IntelliJ )可能提供自动转换。
这是IntelliJ 2022.3为我转换的结果。
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。
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语句的一个紧凑的替代方法。
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。
https://stackoverflow.com/questions/73861923
复制相似问题