【发布时间】:2021-11-06 18:03:48
【问题描述】:
我们有一个 Object 类型的对象列表,例如,我们可能从缓存中获取它们,所以我们想用 lambda 流迭代该列表,并且在每次迭代中映射一个对象之后,我们想看看是否该新类的属性存在于我们传递给该方法的字符串值列表中。
【问题讨论】:
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: java lambda java-8 java-stream
我们有一个 Object 类型的对象列表,例如,我们可能从缓存中获取它们,所以我们想用 lambda 流迭代该列表,并且在每次迭代中映射一个对象之后,我们想看看是否该新类的属性存在于我们传递给该方法的字符串值列表中。
【问题讨论】:
标签: java lambda java-8 java-stream
您的解决方案未优化。使用List.contains 会给您带来O(n*m) 的复杂性。请改用HashSet:
public List<MyClass> getMyClassListByStates(List<String> states) {
Set<String> set = new HashSet<>(states);
return cache.getCacheByCacheNameList(CacheTypeConstants.MY_CLASS)
.stream()
.map(MyClass.class::cast)
.filter(myc -> set.contains(myc.getState()))
.collect(Collectors.toList());
}
这将在O(max(n,m)) 时间运行,而不是O(n*m)。
【讨论】:
.toList()。
java-8
这是我对该问题的解决方案:
public List<MyClass> getMyClassListByStates(List<String> states) {
return cache.getCacheByCacheNameList(CacheTypeConstants.MY_CLASS)
.stream()
.map((myc) -> (MyClass) myc)
.filter(myc -> states.contains(myc.getState()))
.collect(Collectors.toList());
}
如果有人有其他方法,请随意评论,谢谢。
【讨论】:
states.contains 通话费用很高。去Set,它会更快。就个人而言,我更喜欢演员阵容中的方法参考,所以MyClass.class::cast。此外,对于 Java 16+,您可以直接在流上使用 .toList(),而不再需要 .collect(Collectors.toList())。