【发布时间】:2019-08-12 12:30:58
【问题描述】:
我有一个 java 对象列表。对象属性为:
public class CheckPoint {
private String message;
private String tag;
}
现在,我想根据标签找到过滤器列表并获取第一个/最后一个元素。
例如:可能的标签值:A、B、C。对于带有值的标签 A - 我想要最后一个元素,而 B - 我想要第一个元素, C - 第一个元素
当前解决方案:
CheckPoint inTransitCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("A")).reduce((first, second) -> second).orElse(null);
CheckPoint useCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("B")).findFirst.orElse(null);
CheckPoint typeCheckPoint = checkPointsList.stream().filter(c -> c.getTag().equals("C")).findFirst.orElse(null);
但是,我知道这是一个低效的解决方案,因为我们循环了三次。有人可以帮助我以更高效的方式解决它吗?
任何帮助将不胜感激,谢谢:)
【问题讨论】:
-
checkPointsList在最坏的情况下有多大,您是否遇到任何实际性能问题? -
如果你想要代码清晰,Streams 很好。如果您想要性能,
for循环可能更适合在此用例中。 -
你真的应该只使用一个好的老式 for 循环并将开销减少超过 3... 只需在 for 查找之前创建初始变量并有 3 个 if 语句。我完全不同意其他海报说只有在你有性能问题时才改变它。这就是您最终遇到性能问题的方式。或者,如果你真的想使用流,你可以使用 forEach...
-
“这是一个低效的解决方案” 并非如此。与其他循环相比,循环本身相当小。如果您正在寻找该级别的微优化,您应该使用
for循环,而不是流,因为单个流的开销远远超过 3 个for循环的性能,更不用说单个for循环收集所有 3 个结果。简而言之,“低效解决方案”是不正确的,您应该继续使用对您最有意义的代码,直到代码分析显示您确实有问题。 -
对不起,在同一个列表中循环三次以找到三个不同项目的第一次出现是精神错乱的,考虑到他正在积极询问此代码,没有理由继续其他事情.
标签: java performance optimization collections java-8