是否可以使用流过滤对象列表。
public class MyObj{
private String ID;
private String version;
}
MyObj obj1=new MyObj("bike","1.8");
MyObj obj2=new MyObj("bike","2.0");
MyObj obj3=new MyObj("car","3.4");
MyObj obj4=new MyObj("car","4.6");
List<MyObj> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
list.add(obj3);
list.add(obj4);
List<MyObj> filteredData=list.stream(). filter(s1,s2-> { if(s1.getId().equalsIgnoreCase(s2.getId()))
//** I stucked here ,not understanding how to compare objects in stream" **//
List<Myobj> list
(包含上面提到的所有对象)。
我想以这样的方式过滤它,使其返回一个包含最高版本的不同 ID 的列表。
示例:它应该返回 List
个对象。这里应该返回obj2
,obj4
。
请帮忙。
我尝试使用私有方法通过将 ID 和对象列表作为参数传递来过滤我的列表。它将返回具有最高版本的特定 ID 的对象列表。最后,我将所有列表累积到一个列表中。 如果可能的话,我希望使用流来做到这一点。
import java.util.List;
import java.util.stream.Collectors;
public record MyObj(String id, String version) {
public static void main(String[] args) {
System.out.println(List.of(new MyObj("bike","1.8"),
new MyObj("bike","2.0"),
new MyObj("car","3.4"),
new MyObj("car","4.6"))
.stream()
.collect(Collectors.groupingBy(m -> m.id(),
Collectors.maxBy((o1, o2) -> o1.version().compareTo(o2.version()))))
.values());
}
}
MyObj
适合成为记录。
在上面的代码中,我首先使用方法
of(在 JDK 9 中添加)创建了
List
的 MyObj
实例。
然后我创建一个
Stream<MyObj>
。
方法
groupingBy
返回 Map
。
方法
groupingBy
的第一个参数是提供 Map
键的 lambda 表达式。
方法
groupingBy
的第二个参数适用于 Stream<List<MyObj>>
。因此 maxBy
将返回 List
的每个 Stream
元素中的最大元素,并且最大元素由 Comparator
确定。在上面的代码中,Comparator
比较给定version
中每个MyObj
实例的List
成员。
结果是一个
Map
,其中键是 id
(MyObj
对象的),值是最大的 version
。
最后,在
values
上调用方法 Map
将返回 List
值的 Map
,其中每个值都包装在 Optional
中。
运行上面的代码会产生以下结果:
[Optional[MyClass[id=car, version=4.6]], Optional[MyClass[id=bike, version=2.0]]]