我正在编写一个方法,该方法采用Map
形式的输入Map<Term, List<Integer>>
,Term
定义为here。
方法:
Map
的密钥并使用Term
属性对其进行过滤。 min(List.size(), 5)
)并将输出添加到全局变量(例如,totalSum
)totalSum
这是我到目前为止所写的:
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,并且好奇如果使用它可以解决这个问题。
答案 0 :(得分:11)
您不需要forEach
方法。您可以map
Map
的每个条目int
和sum
这些整数:
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,以下内容可以使用MutableMap和IntList。
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。