【发布时间】:2020-09-12 01:49:48
【问题描述】:
我有一个元素列表,并且想要提取字段属性的值。 问题:所有元素都应该具有相同的属性值。
我能比下面的做得更好或更优雅吗?
Set<String> matches = fields.stream().map(f -> f.getField()).collect(Collectors.toSet());
if (matches.size() != 1) throw new IllegalArgumentException("could not match one exact element");
String distrinctVal = matches.iterator().next(); //continue to use the value
这是否可以直接使用流方法,例如使用reduce?
【问题讨论】:
-
如果您的元素应该通过
equals进行比较,那么您的解决方案是正确的并且比大多数其他解决方案更快。与通常的流一样,迭代代码可以更快地结束,因为它可以在发现不匹配时更快地中止。 -
如果“fields”为空,它甚至会抛出异常?
-
@TreffnonX 还可以在流管道中添加一点盐 (
limit(2)) 以尽可能实现短路。 -
您的代码有效吗?
if (matches.size() != 1)和 所有元素都应该具有相同的属性值。 看起来并不足以执行。出于一些猜测,看起来groupBy对于用例可能更实用。
标签: java java-stream