使用lambda获取此对象的ArrayList中对象中所有字符串的长度之和

时间:2018-07-09 10:38:30

标签: java lambda

我有一个包含此类对象的数组列表:

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();
        }

4 个答案:

答案 0 :(得分:1)

您可以使用flatMapToIntStream<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();