编程技术文章分享与教程

网站首页 > 技术文章 正文

Java8的新特性Lambda表达式第一篇:语法和函数接口

hmc789 2024-11-16 20:56:39 技术文章 2 ℃

技术/杨33


一、什么是Lambda表达式

Lambda表达式,即函数式编程。

函数接口:有且仅有一个抽象方法的接口。

二、使用Lambda表达式的优点和缺点

1、优点

  • 可以减少代码的体积,减少匿名内部类的创建,节省内存空间
  • 使用时不用去记忆所使用的接口和抽象函数

2、缺点

  • 易读性较差,阅读代码的人需要熟悉Lambda表达式和抽象函数中参数的类型
  • 不方便调试

三、Lambda表达式的语法

Lambda表达式在Java语言中引入了一种新的语法元素和操作符,它就是“->”,该操作符被称为Lambda操作符或者箭头操作符。它将Lambda表达式分为左右两部分

  • 左侧:指定了Lambda表达式需要的所有参数
  • 右侧:指定了要执行的Lambda表达式体

语法格式如下:

1、参数的数据类型可以省略不写,因为编译器可以通过上下文推断出来

2、无参、无返回值,Lambda体只需一条语句

Runnable runnable = () -> System.out.println("hello lambda");

3、一个参数

Closure closure = (x) -> System.out.println(x);

4、一个参数时,小括号可以省略

Closure closure = x -> System.out.println(x);

5、两个参数,有返回值

Comparator<Integer> tComparator = (x, y) -> {
          return Integer.compare(x, y);
};

6、Lambda体只有一条语句时,return和大括号可以省略

Comparator<Integer> tComparator = (x, y) -> Integer.compare(x, y);

四、自定义函数接口

只需编写只有一个抽象方法的接口即可,代码中的@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范

@FunctionalInterface
public interface DemoService<T> {
    void test(T t);
}

使用自定义的函数接口代码如下:

DemoService<String> demoService = str -> System.out.println(str);
demoService.test("自定义函数接口");

五、Java内置的四大核心函数接口

1、Consumer<T> 消费型接口

例如:对类型为”张三“的字符串应用操作。

@org.junit.Test
public void lam() {
        demo("张三", s -> System.out.println("你好," + s));
        public void demo(String str, Consumer<String> consumer) {
        consumer.accept(str);
    }

2、Supplier<T> 供给型接口Function<T, R> 函数型接口

    @org.junit.Test
    public void lam() {
        List<Integer> numList = getNumList(1, () -> (int) (Math.random() * 10));
        //输出0到10之间的随机的一个整数
        for (Integer i : numList) {
            System.out.println(i);
        }
    }

    public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Integer integer = supplier.get();
            list.add(integer);
        }
        return list;
    }

3、Function<T, R> 函数型接口

    @org.junit.Test
    public void lam() {
        String string = setString("这是函数型接口", s -> s.substring(0, 2));
        System.out.println(string);
    }

    public String setString(String str, Function<String, String> function) {
        return function.apply(str);
    }

4、Predicate<T> 断定型接口

    @org.junit.Test
    public void lam() {
        System.out.println(com(3, a -> a > 2));
    }

    public boolean com(int a, java.util.function.Predicate<Integer> predicate) {
        return predicate.test(a);
    }

六、除了内置的四大核心函数接口外,Java还提供了一些其他的接口

七、Lambda表达式的方法引用

方法引用,使用的前提条件是什么呢?

  • 方法引用所引用的方法的参数列表必须要和函数式接口中抽象方法的参数列表相同(完全一致)。
  • 方法引用所引用的方法的的返回值必须要和函数式接口中抽象方法的返回值相同(完全一致)。

方法引用的3种语法格式分别如下:

1、对象::实例方法

    @org.junit.Test
    public void lam() {
        User user = new User("张三", 18, "女");
        Supplier<String> supplier = user::getName;
        System.out.println(supplier.get());
    }

2、类名::静态方法名

    @org.junit.Test
    public void lam() {
        Supplier<String> supplier = User::getInfo;
        System.out.println(supplier.get());
    }

3、类::实例方法

    @org.junit.Test
    public void lam() {
        BiPredicate<String, String> predicate = String::equals;
        System.out.println(predicate.test("a", "b"));
    }

八、Lambda表达式的构造器引用

构造器使用的前提是什么?

  • 构造器参数列表要与函数接口中抽象方法的参数列表一致!

构造器引用的语法格式如下:

类名 :: new

    @org.junit.Test
    public void lam() {
        BiConsumer<String, Integer> biConsumer = User::new;
        biConsumer.accept("李四", 18);
    }



下一篇文章中,会写Lambda表达式在Java集合框架中的应用


作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。

标签列表
最新留言