gpt4 book ai didi

java - 流 : Filter on children, 返回父级

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:26 24 4
gpt4 key购买 nike

假设一个类MyClass :

public class MyClass {

private final Integer myId;
private final String myCSVListOfThings;

public MyClass(Integer myId, String myCSVListOfThings) {
this.myId = myId;
this.myCSVListOfThings = myCSVListOfThings;
}

// Getters, Setters, etc
}

还有这个流:

final Stream<MyClass> streamOfObjects = Stream.of(
new MyClass(1, "thing1;thing2;thing3"),
new MyClass(2, "thing2;thing3;thing4"),
new MyClass(3, "thingX;thingY;thingZ"));

我想返回 MyClass 的每个实例包含条目 "thing2"myCSVListOfThings .

如果我想要一个 List<String>包含 myCSVListOfThings这可以很容易地完成:

List<String> filteredThings = streamOfObjects
.flatMap(o -> Arrays.stream(o.getMyCSVListOfThings().split(";")))
.filter("thing2"::equals)
.collect(Collectors.toList());

但我真正需要的是 List<MyClass> .

这是我现在拥有的:

List<MyClass> filteredClasses = streamOfObjects.filter(o -> {
Stream<String> things = Arrays.stream(o.getMyCSVListOfThings().split(";"));
return things.anyMatch(s -> s.equals("thing2"));
}).collect(Collectors.toList());

但不知何故感觉不对。比打开一个新的 Stream 更清洁的解决方案在 Predicate 里面?

最佳答案

首先,我建议您向 MyClass public boolean containsThing(String str) 添加额外的方法,这样您就可以像这样转换代码:

List<MyClass> filteredClasses = streamOfObjects
.filter(o -> o.containsThing("thing2"))
.collect(Collectors.toList());

现在你可以根据输入数据实现这个方法:拆分成Stream,拆分成Set,甚至搜索substring (如果可能并且有意义),如果需要,缓存结果。

你对这个类的用法了解得更多,所以你可以做出正确的选择。

关于java - 流 : Filter on children, 返回父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38973410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com