Java 8 Stream 使用

问题描述 投票:0回答:1

是否可以使用流过滤对象列表。

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 的对象列表。最后,我将所有列表累积到一个列表中。 如果可能的话,我希望使用流来做到这一点。

java java-stream
1个回答
0
投票
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]]]
© www.soinside.com 2019 - 2024. All rights reserved.