我有一个包含此类对象的数组列表:
public class SearchCriteria {
private String key;
private String operation;
private Object value;
}
如何计算此ArrayList中所有对象中所有String的长度? 可以在foreach中完成,但我想也可以在lambda中完成,但是我不知道它是如何偷偷摸摸的和现代的。
现在我的解决方法是:
Integer sum=0;
for (SearchCriteria s: builder.getParams()
) {
sum+=s.getKey().length();
sum+=s.getOperation().length();
sum+=s.getValue().toString().length();
}
答案 0 :(得分:1)
您可以使用flatMapToInt
将Stream<SearchCriteria >
转换为IntStream
,其中包含原始Stream
元素的所有属性的长度:
int sum = builder.getParams()
.stream()
.flatMapToInt(sc -> IntStream.of(sc.getKey().length(),sc.getOperation().length(),sc.getValue().toString().length()))
.sum();
答案 1 :(得分:0)
我不知道为什么这对您有用,但是您可以尝试以下方法:
List<SearchCriteria> criterion = builder.getParams();
int sum = criterion.stream().map(s -> s.getKey() + s.getOperation() + s.getValue())
.mapToInt(String::length).sum();
答案 2 :(得分:0)
您可以使用:
List<SearchCriteria> list = ...
int sum = list.stream()
.flatMapToInt(crit -> Arrays.stream(new int[] {
crit.getKey().length(),
crit.getOperation().length(),
crit.getValue().toString().length()}))
.sum();
这使所有length
值都成为一个int流,并简单地求和。
答案 3 :(得分:0)
您不能直接总结流元素的不同之处。
因此,作为替代方案,我将使用SearchCriteria
方法提取计算逻辑,例如:
public int computeAllLength(){
return key.length() + operation.length() + value.toString().length();
}
我将以这种方式使用它:
int sum = builder.getParams().stream()
.mapToInt(SearchCriteria::computeAllLength)
.sum();