Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8流在Java集合中查找给定值的最近对象_Java_Java Stream - Fatal编程技术网

使用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
将根据最近的时间(给定的时间戳)和do
get(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)