java - 如何在 Java 8 流中增加计数

标签 java java-8

我有一个 MapList 看起来像

int total = 0;
int incr = 10;
Map<String, Boolean> hashMap = new HashMap();
hashMap.put("A", true);
hashMap.put("B", false);
hashMap.put("C", true);

List<String> states = new ArrayList<>();
states.add("A");
states.add("B");
states.add("D");
states.add("E");
states.add("F");

每次我从 Map 的列表中找到一个键,然后我想通过增加值来增加我的总数;

states.stream()
            .filter(s -> hashMap.containsKey(s) && hashMap.get(s))
            .forEach((s) -> {total = total + incr;} );

最佳答案

您的变量 total 必须是最终的(即:带有关键字 final)或实际上是最终的(即:您只在 lambda 之外为其赋值一次)。否则,您不能在 lambda 表达式中使用该变量。你可以像这样修复它,

int total = states.stream()
    .filter(s -> hashMap.containsKey(s) && hashMap.get(s))
    .mapToInt(k -> incr).sum();

如以下评论所述,这可以进一步简化为,

int total = states.stream()
    .filter(s -> hashMap.getOrDefault(s, false))
    .mapToInt(k -> incr).sum();

关于java - 如何在 Java 8 流中增加计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53166265/

相关文章:

java - 如何使用导入另一个模式文件的模式文件验证 XML?

java - Intellij 警告 : Return value of the method is never used

java - Android - 以编程方式向 Activity 添加关键监听器

java - 如何在安卓中打开gmail

maven-3 - proguard-maven-插件 java 8

java - 我有一个以文件名作为输入的方法,应该返回一个数组作为输出。该文件包含带有科目名称和分数的学生记录

java - Android 从 GMT 毫秒获取 UTC 毫秒

java - 使用 lambda 执行 void : Is this correct?

java - 为什么MANIFEST.MF和类文件中的JDK版本不同

java - 在 Lambda 表达式(Java)中,如何使用不带参数的表达式?