Java 8 - 在地图值

时间:2016-03-21 07:30:52

标签: java iterator java-8 java-stream collectors

我正在编写一个方法,该方法采用Map形式的输入Map<Term, List<Integer>>Term定义为here

方法:

  1. 浏览Map的密钥并使用Term属性对其进行过滤。
  2. 对于其余每个键,获取相应列表的大小,将其限制为5(min(List.size(), 5))并将输出添加到全局变量(例如,totalSum
  3. 返回totalSum
  4. 这是我到目前为止所写的:

     inputMap
        .entrySet()
        .stream()
        .filter(entry -> entry.getKey().field().equals(fieldName))    // Keep only terms with fieldName
        .forEach(entry -> entry.getValue()
            .map(size -> Math.min(entry.getValue().size(), 5)))   // These 2 lines do not work
            .sum();
    

    我无法将列表流作为输入,为每个列表输出一个整数,并返回所有输出的总和。

    我显然可以使用for循环来编写它,但我正在尝试学习Java 8,并且好奇如果使用它可以解决这个问题。

3 个答案:

答案 0 :(得分:11)

您不需要forEach方法。您可以map Map的每个条目intsum这些整数:

int sum = inputMap
    .entrySet()
    .stream()
    .filter(entry -> entry.getKey().field().equals(fieldName))
    .mapToInt(entry -> Math.min(entry.getValue().size(), 5))
    .sum();

答案 1 :(得分:2)

使用Eclipse Collections,以下内容可以使用MutableMapIntList

MutableMap<Term, IntList> inputMap =
    Maps.mutable.of(term1, IntLists.mutable.of(1, 2, 3), 
                    term2, IntLists.mutable.of(4, 5, 6, 7));

long sum = inputMap
    .select((term, intList) -> term.field().equals(fieldName))
    .sumOfInt(intList -> Math.min(intList.size(), 5));

注意:我是Eclipse Collections的提交者。

答案 2 :(得分:0)

forEach调用终止了流。您可以直接使用map而不使用forEach。