java8lambda表达式

走在修行的大街上      2022-04-20     694

关键词:

Java 8 Lambda 表达式
语法
lambda 表达式的语法格式如下:

(parameters) -> expression
或
(parameters) ->{ statements; }

Lambda 表达式实例

public class Calculator {

    interface IntegerMath {
        int operation(int a, int b);
    }

    public int operateBinary(int a, int b, IntegerMath op) {
        return op.operation(a, b);
    }

    public static void main(String... args) {
        Calculator myApp = new Calculator();
        IntegerMath addition = (a, b) -> a + b;
        IntegerMath subtraction = (a, b) -> a - b;
        System.out.println("40 + 2 = " + myApp.operateBinary(40, 2, addition));
        System.out.println("20 - 10 = " + myApp.operateBinary(20, 10, subtraction));
    }
}

点击查看结果

``` 40 + 2 = 42 20 - 10 = 10 ```
public class Java8Lambda {
    public static void main(String args[]) {
        Java8Lambda tester = new Java8Lambda();

        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;

        // 不用类型声明
        MathOperation subtraction = (a, b) -> a - b;

        // 大括号中的返回语句
        MathOperation multiplication = (int a, int b) -> {
            return a * b;
        };

        // 没有大括号及返回语句
        MathOperation division = (int a, int b) -> a / b;

        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));

        // 不用括号
        GreetingService greetService1 = message -> System.out.println("Hello " + message);

        // 用括号
        GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

        greetService1.sayMessage("Runoob");
        greetService2.sayMessage("Google");
    }

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation) {
        return mathOperation.operation(a, b);
    }
}

点击查看结果

``` 10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Runoob Hello Google ```

变量作用域
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

import java.util.function.Consumer;

public class LambdaScopeTest {

    public int x = 0;

    class FirstLevel {
        public int x = 1;

        void methodInFirstLevel(int x) {

            // The following statement causes the compiler to generate
            // the error "local variables referenced from a lambda expression
            // must be final or effectively final" in statement A:
            //
            // x = 99;

            Consumer<Integer> myConsumer = (y) -> {
                System.out.println("x = " + x); // Statement A
                System.out.println("y = " + y);
                System.out.println("this.x = " + this.x);
                System.out.println("LambdaScopeTest.this.x = " + LambdaScopeTest.this.x);
            };

            myConsumer.accept(x);
        }
    }

    public static void main(String... args) {
        LambdaScopeTest st = new LambdaScopeTest();
        LambdaScopeTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

点击查看结果

``` x = 23 y = 23 this.x = 1 LambdaScopeTest.this.x = 0 ```

lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改。(即隐性的具有 final 的语义)

public class Java8Tester {
    public static void main(String args[]) {
        final int num = 1;
        Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
        s.convert(2);  // 输出结果为 3
    }
 
    public interface Converter<T1, T2> {
        void convert(int i);
    }
}

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

参考资料

java8lambda表达式

去重//Person集合List<Person>list=newArrayList<>();//根据对象属性name去重,返回Person集合List<Person>persons=list.stream().collect( collectingAndThen(toCollection( ()->newTreeSet< 查看详情

java8lambda表达式

1.什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子:   publicintadd(intx,inty){       returnx+y;   }转成λ表达式后是这个样子:      &n 查看详情

使用mockito为java8lambda表达式编写存根

我有一个方法,我使用Java8lambda表达式。在为这个方法编写单元测试时,我需要为该表达式编写存根。我们怎么写这个?publicList<User>methodA(StringuserId){List<User>users=newArrayList<>();userRepository.findAll().forEach(users::add);List&l 查看详情

java8lambda表达式(代码片段)

Lambda表达式归档//Person集合List<Person>list=newArrayList<>();去重distinct//根据对象属性name去重,返回Person集合List<Person>persons=list.stream().collect( collectingAndThen(toCollection( ( 查看详情

java8lambda表达式(代码片段)

java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。实体类importjava.math.BigDecimal;importjava.util.Date;publicclassUserprivateLongid;//姓名private... 查看详情

java8lambda表达式(代码片段)

java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对比,能少写不少代码。实体类importjava.math.BigDecimal;importjava.util.Date;publicclassUserprivateLongid;//姓名private... 查看详情

java8lambda表达式10个示例

 1.实现Runnable线程案例使用()->{} 替代匿名类://BeforeJava8:newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("BeforeJava8");}}).start();//Java8way:newThread(()->System.out.println("InJ 查看详情

java8lambda表达式

刚过了春节,来上班,感觉上有些疲乏,劳累。眼睛无法适应长时间盯着屏幕。所以总结一下java8的新特性,lambda用法。功能接口、函数集合、方法引用、interface默认方法默认方法:  java8允许我为接口自身指定实现一个默认... 查看详情

java8lambda表达式示例

例1、用lambda表达式实现Runnable我开始使用Java8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。我们在这... 查看详情

java8lambda表达式的10个例子(转)

原文:http://jobar.iteye.com/blog/2023477Java8中Lambda表达式的10个例子例1用Lambda表达式实现Runnable接口Java代码收藏代码//BeforeJava8:newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("BeforeJava8,toomuchcodef 查看详情

java8lambda表达式

Java8出来很久了,正好在看RXJava,据说学习了lambda和streamapi,可以能快速的理解RXJava,于是就来看看Java8的新特性。为什么使用Lambda表达式?Lambda表达式是一个匿名函数,是一段可以传递的代码,因此它... 查看详情

java8lambda表达式(代码片段)

【前言】 java8新特性java8函数接口java8Optional使用总结Java8时间日期使用 java8中一个非常重要的特性就是lambda表达式,我们可以把它看成是一种闭包,它允许把函数当做参数来使用,是面向函数式编程的思想,一定程度上可... 查看详情

java8lambda原理

为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先想一想,Java 8中每一个Lambda... 查看详情

java8lambda的使用

与python不一样,pythonlambda是定义匿名函数,而在java8中lambda是匿名内部类例1、用lambda表达式实现Runnable我开始使用Java8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例。看一下Java8之前的runnabl... 查看详情

java8lambda表达式10个示例存

 PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip在Java8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表... 查看详情

java8lambda表达式一看就会

匿名内部类的一个问题是:当一个匿名内部类的实现非常简单,比如说接口只有一个抽象函数,那么匿名内部类的语法有点笨拙且不清晰。我们经常会有传递一个函数作为参数给另一个函数的实际需求,比如当点击一个按钮时,... 查看详情

初探java8lambda表达式

要说现在什么火,估计函数式编程算一个吧,看看人家javascript写起来多爽,java呢?一切皆对象。好像离着函数式编程挺远的,不过在java8中我们终于迎来了类似函数式编程-Java风格的lambda表达式,在用lambda... 查看详情

java8lambda表达式多个list取交集(代码片段)

Java8之前做法:/***从有值的list里取交集*@paramlists*@return*/publicList<Object>intersection(List<List<Object>>lists)if(lists==null||lists.size()==0)returnnull;ArrayList<List<Object>&g 查看详情