Java基础—— 匿名类函数式接口

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础—— 匿名类函数式接口相关的知识,希望对你有一定的参考价值。

Lambda

【匿名类】
Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
常见有匿名类实现接口:

new Thread(new Runnable() {
            @Override
            public void run() {
                
            }
        });

在这里插入图片描述注意接口在Java8之后提供了方法实现,即被default关键词修饰的方法。但是default方法不被认为是接口的方法,即在Lambda表达式 时不算在内。

口诀: 拷贝小括号 写死右箭头 落地大括号

Supplier函数式接口

使用Supplier传参可以减少代码的浪费执行,只有有必要时才执行。
在这里插入图片描述

package com.lambda;

import java.util.function.Supplier;

public class SupplierDemo {

    public static String getFirstString(String s1, Supplier<String> s2Supplier){
        if( s1 != null && s1.length() > 0) return s1;
        //只有当s1为null时才通过Supplier函数式接口调用生成s2的方法
        String s2 = s2Supplier.get();
        if( s2 != null && s2.length() > 0) return s2;
        return null;
    }
    public static void main(String[] args) {
        System.out.println(getFirstString("", new Supplier<String>() {
                    public String get() {
                        return makeString();
                    }
                })
        );
        //lambda表达式 写法
        System.out.println(getFirstString("",() -> makeString()));


    }

    private static String makeString() {
        System.out.println("makeString ……");
        return String.format("%d %s", 1, "hello");
    }
}

Consumer

package com.lambda;

import java.util.function.Consumer;

public class ConsumerDemo {

    public static void forEach(int nums[], Consumer<Integer> consumer){
        if( nums == null || consumer == null) return;
        for(Integer num: nums){
            //该函数式接口接受num
            consumer.accept(num);
        }
    }

    public static void main(String[] args) {
        int nums[] = {1, 2, 3, 4, 5};
        forEach(nums, new Consumer<Integer>() {
            //接收到这里
            @Override
            public void accept(Integer integer) {
                System.out.println(integer + 10);
            }
        });
		//lambda 写法
        forEach(nums,integer -> System.out.println(integer + 10));


    }
}

Consumer then

相当于 c1.accept(n) ,c2.accept(n)
在这里插入图片描述

predict

test() 传判断表达式。

在这里插入图片描述

predicate and

两个表达式都要满足。
在这里插入图片描述

以上是关于Java基础—— 匿名类函数式接口的主要内容,如果未能解决你的问题,请参考以下文章

函数式接口的匿名内部类与Lambda表达式的实现

Java Lambda表达式

使用lambda表达式和函数式接口Predicate

JAVA——进阶语法——使用lambda表达式(λ)进行函数式编程,对匿名内部内代码简化思路及案例在线程中的应用

Lambda 表达式 in java 8

Java之lambda表达式与函数式接口