使用Java8流在Java集合中查找给定值的最近对象
我想从给定时间戳值的集合中查找匹配项或最近的项 我的收藏是一张物品清单。。它包含使用Java8流在Java集合中查找给定值的最近对象,java,java-stream,Java,Java Stream,我想从给定时间戳值的集合中查找匹配项或最近的项 我的收藏是一张物品清单。。它包含名称,id,时间戳等 String id; long timestamp; 我想首先匹配Id(可以有多个),然后找到给定时间戳的匹配项,或者从集合中返回最接近它的值。我该怎么做 myList.stream().filter(p -> p.getId().equals(Id)) .min((f1,f2) -> Math.abs(f1.getTS() - timestamp)
名称
,id
,时间戳
等
String id;
long timestamp;
我想首先匹配Id(可以有多个),然后找到给定时间戳的匹配项,或者从集合中返回最接近它的值。我该怎么做
myList.stream().filter(p -> p.getId().equals(Id))
.min((f1,f2) -> Math.abs(f1.getTS() - timestamp) - Math.abs(f2.getTS() - timestamp))
.findfirst().get();
它也有长到整数转换的问题
错误:类型不匹配-无法从long转换为int
试试这个
List<User> userList = users.stream()
.filter(user -> user.getId().equals(ID))
.sorted(Comparator.comparingLong(user -> Math.abs(TIME - user.getTime())))
.collect(Collectors.toList());
List userList=users.stream()
.filter(用户->用户.getId().equals(ID))
.sorted(Comparator.comparingLong(user->Math.abs(TIME-user.getTime()))
.collect(Collectors.toList());
userList
将根据最近的时间(给定的时间戳)和doget(0)
对两件事进行排序,一件是比较器返回类型不匹配,这从您得到的错误中可以明显看出。当您比较两个Long
值而不是执行减法(-
)进行比较时,可以解决此问题
.min((f1,f2) -> Long.compare(Math.abs(f1.getTS() - timestamp), Math.abs(f2.getTS() - timestamp)))
然后进一步简化为
.min(Comparator.comparingLong(f -> Math.abs(f.getTS() - timestamp)))
另一个方面是findFirst
与min
的混合,因为min
本身返回一个可选的作为流的最小元素。因此,您的解决方案可以通过以下方式修复:
YourClass closest = myList.stream().filter(p -> p.getId().equals(id))
.min(Comparator.comparingLong(f -> Math.abs(f.getTS() - timestamp)))
.orElse... // throw exception or choose default value
看来这里的问题可能是你提到的转换。你能提供变量的类型和错误消息吗?最有可能的是,f1.getTS()-timestamp
和f2.getTS()-timestamp
的类型是long
。您应该使用Long.compare(Long,Long)