首页 > 编程语言 >Java中解决lambda表达式内部访问在其外部定义的变量-使用mapToInt

Java中解决lambda表达式内部访问在其外部定义的变量-使用mapToInt

时间:2023-01-06 13:56:15浏览次数:51  
标签:integers mapToInt 编译 Java total final 表达式 lambda

场景

Java8新特性-Stream对集合进行操作的常用API:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657

上面介绍Stream的相关使用示例。

如果遇到在lambda表达式内部访问在其外部定义的变量,比如一个求和算法

        List<Integer> integers = Arrays.asList(1, 2, 4, 6, 7, 9);

        int total = 0;
        //采用传统的for-each循环对所有值求和
        for (int n:integers
             ) {
            total +=n;
        }

        System.out.println(total);

 

除了采用传统for循环之外,如果想使用lambda表达式实现

        total = 0;
        //forEach方法传入Consumer作为参数,如果Consumer试图修改tatal变量,则代码不会编译
        //integers.forEach(integer -> total +=integer);//不通过编译

则代码不会通过编译。

 

 

必须将在 lambda 表达式内部访问的局部变量声明为 final,

或使其具备等同于 final 的效果(effectively final)。可以对特性(attribute)进行访问和修改。

在 Java 8 中,变量不必采用 final 修饰,但必须具备等同于final的效果。

换言之,任何试图修改局部变量值的代码都不会被编译。

可以通过将流转换为IntStream并调用sum方法。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

        total = integers.stream()
                .mapToInt(Integer::valueOf)
                .sum();
        System.out.println(total); 

 

标签:integers,mapToInt,编译,Java,total,final,表达式,lambda
From: https://www.cnblogs.com/badaoliumangqizhi/p/17030217.html

相关文章

  • com.sun.tools.javac.code.TypeTags
    java:java.lang.ExceptionInInitializerErrorcom.sun.tools.javac.code.TypeTags   这个可能原因是你编译器的环境使用过高。但是你的依赖 <dependency>......
  • Java监听器实现原理
    文章目录​​监听器模型​​​​案例实现​​​​`DeveloperListener`​​​​`Developer`​​​​`Event`​​​​`DeveloperListenerImpl`​​​​测试​​监听器就是监听......
  • Day10:学习基础java方法
    方法何谓方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法......
  • (一)Java入门
    java入门1、java跨平台原理:JVM(java虚拟机)2、JRE:包括JVM和运行所要的核心类库JDK:编译工具javac.exe运行工具java.exe(在bin目录下)3、常用DOS命令(1)dir:显示目录(2)cd......
  • Java volatile
    JMM:Java内存模型要想学习volatile,就不得不了解JMM。JVM运行程序的实体是线程,每个线程在被创建时JVM都会为其创建一个自己私有的工作内存。而Java内存模型规定所有的变......
  • Java并发容器之LinkedBlockingQueue源码分析
    一、简介LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。二、源码分析2.1属性 //容量private......
  • Java的四种引用方式
    java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。java对象的引用包括  强引用,软引用,弱引用,虚引用Java中提供......
  • 2023.1.06 java打印杨辉三角(二维数组)
    publicclassyanghui{publicstaticvoidmain(String[]args){int[][]yanghui=newint[10][];for(inti=0;i<yanghui.length;i++){......
  • [JavaScript]分解url参数
    分解页面url传入参数转载:来自https://www.jianshu.com/p/6dd040f6800dfunctioninit_params(){varurl=location.search;//获取url中"?"符后的字串......
  • 『中级篇』docker之CI/CD持续集成—真实JAVA-Maven项目的CI演示(73)
    ICD。项目通过gitlab和gitlabCI进行CICD。源码地址:​​​https://github.com/limingios/gitlabci-maven​​​源码:​​https://github.com/limingios/docker/tree/master/......