美文网首页
Java Lambda表达式

Java Lambda表达式

作者: Tinyspot | 来源:发表于2022-08-17 12:35 被阅读0次

概念

  • 行为参数化:让方法接受多种行为(策略)作为参数,并在内部使用,来完成不同的行为
  • 缺失的方法主体随接口提供了(因此就有了默认实现),而不是由实现类提供

2. Lambda 表达式

  • Lambda 表达式是一种简洁的语法,用于替换实现函数接口的匿名内部类
  • Lambda 表达式允许把函数作为方法参数传递
  • 注意:Lambda 表达式不会生成一个单独的内部类文件

总结:Lambda 是一个匿名函数(inner class),是一段可以传递的代码

基本语法:

<函数式接口> <变量名> = (参数1, 参数2...) -> {
    // 方法体
};

箭头操作符(->)将 Lambda 表达式拆成两部分
左侧:参数列表
右侧:功能,即方法体

注意事项:

  • 参数列表的数据类型会自动推断(类型可以省略,JVM编译器可以通过上下文进行类型推断;若类型不确定还是要写的 (String key, User user) -> ...
  • 只有一个参数时,小括号可以省略
  • 无参数时,只需保留 ()
  • 若只有 1 个参数,() 可省略,只需要参数名称即可
  • 若执行语句只有一句,无返回值时,{} 可省略;有返回值时,return 也必须省略

表达式风格 vs 块风格的Lambda

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

2.1 扩展:两个箭头

两个箭头,定义两个函数,第一个函数是函数定义函数,第二个是该函数的结果,该函数也恰好是函数

IntFunction<IntUnaryOperator> curriedAdd = (a) -> {
    return (b) -> {
        return a + b;
    };
};
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;

3. 函数式接口(Functional Interface)

  • have only one abstract method

函数式接口就是只定义一个抽象方法的接口(可以有很多默认方法)
函数式接口可以使用 Lambda 表达式,Lambda 表达式会被匹配到这个抽象方法上

@FunctionalInterface 可检测接口是否符合函数式接口

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符

3.1 常用函数式接口

public interface Consumer<T> {
    void accept(T t);
}
public interface Supplier<T> {
    T get();
}
public interface Function<T, R> {
    R apply(T t);
}
// 谓词(predicate)接受一个参数值,并返回 true 或 false
public interface Predicate<T> {
    boolean test(T t);
}

示例:

public static void main(String[] args) {
    Consumer<String> consumer = str -> System.out.println(str);
    BiConsumer<String, Long> biConsumer = (str, l) -> System.out.println(str + "; " + l);
    // demo
    consumer.accept("222");
    biConsumer.accept("str", 1000L);

    Function<Long, String> function = (Long l) -> l.toString();
    String apply = function.apply(1000L);
    System.out.println(apply);
}

4. Lambda Basics Demo

  • public void greet(action) { action(); }
  • 行为参数化
public class Greeter {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        greeter.greet();
    }
    public void greet() {
        System.out.println("Hello World!");
    }
}
public interface Greeting {
    void perform();
}
public class HelloGreeting implements Greeting {
    @Override
    public void perform() {
        System.out.println("Hello World!");
    }
}

public class Greeter {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        greeter.greet(new HelloGreeting());
    }
    // 改进
    public void greet(Greeting greeting) {
        greeting.perform();
    }
}

其他

public class LambdaGrammer {
    @Test
    public void test1() {
        Runnable runnable = () -> System.out.println("running");

        // 如果在局部内部类中用了局部变量,在 JDK7 前必须是 final
        int num = 0;
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("Running..." + num);
                // 会报错,本质上还是 final, 默认加上了
                // System.out.println("Running..." + num++);
            }
        };

        // Runnable runnable = () -> System.out.println("running" + num);
    }

相关文章

  • Java 8 - Lambda表达式

    Java 8 - Lambda表达式 1 Java 8-概述2 Java 8 - Lambda表达式3 Java ...

  • 【Java】4.0 Java中lambda表达式(下)

    【Java】3.0 Java中lambda表达式(上)【Java】4.0 Java中lambda表达式(下) 7....

  • java 8 lambda表达式中的异常处理

    java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,lambda表达式可以...

  • java8

    1.lambda表达式《java8 Lambda表达式简介》 《java8 lambda表达式,方法的引用以及构造...

  • 《Java 8实战》学习总结

    Java 8新特性概览 Lambda表达式 流 默认方法 Lambda表达式 Lambda和函数式接口Java 8...

  • Java零基础自学DAY10 2018-03-22

    Java 8 新增的lambda表达式 Lambda 转换: Lambda表达式组成: 形参列表 箭头 ( ->)...

  • Java 8、9 语言新特性

    Java语言新特性 Java8 Java 8 新特性 Lambda 表达式 Lambda表达式(也叫做闭包)是Ja...

  • Java的Lambda表达式

    Java的Lambda表达式 1. 什么是Lambda表达式 简单的说,Lambda表达式就是匿名方法。Lambd...

  • Lambda表达式

    Lambda表达式与函数式接口紧密相关,函数式接口介绍 Lambda表达式的基本语法 Java Lambda表达式...

  • 7 Lambda表达式

    Lambda表达式是Java8的重要更新,Lambda表达式支持将代码块作为方法参数,Lambda表达式允...

网友评论

      本文标题:Java Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/veuixrtx.html