首页 > 其他分享 >函数式接口

函数式接口

时间:2024-04-05 20:30:22浏览次数:18  
标签:String 函数 接口 println public 表达式 Lambda

什么是函数式(Functional)接口

  • 只包含一个抽象方法的接口,称为函数式接口
  • 你可以通过 Lambda 表达式来创建接口的对象。(若 Lambda 表达式抛出一个受检异常 – 即:非运行时异常,那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个借口是一个函数式接口。
  • 在 java.util.function 包下定义了 Java 8 的丰富的函数式接口

自定义函数

示例一:

1
2
3
4
@FunctionalInterface
public interface MyNumber{
    public double getValue();
}

示例二:(函数式接口中使用泛型)

1
2
3
4
@FunctionalInterface
public interface MyFunction<T>{
    public  T  getValue(T t);
}

作为参数传递Lambda表达式

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public String strHandler(String str, MyFunction<String> mf) {
        return mf.getValue(str);
}

//作为参数传递 Lambda 表达式(自定义函数式接口)
@Test
public void m() {
    //原来写法
    String handler = strHandler("帅是没有道理的 ", new MyFunction<String>() {
        @Override
        public String getValue(String s) {
            return s.trim();
        }
    });
    System.out.println(handler);

    //Lambda 表达式的写法
    String trimStr = strHandler("帅是没有道理的 ", str -> str.trim());
    System.out.println(trimStr);
    
    String upperStr = strHandler("abcdefg", (str) -> str.toUpperCase());
    System.out.println(upperStr);
    
    String newStr = strHandler("have a good night", (str) -> str.substring(2, 5));
    System.out.println(newStr);
}

作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收 Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型。

Java 内置四大核心函数式接口

在学习 lambda 表达式的时候,我们知道,要使用 lambda 表达式,我们就要创建一个函数式接口,那每次用 lambda 表达式的时候岂不是很麻烦,这时候,Java 给我们内置了四大核心函数式接口。

还有一些其他接口

四大接口示例

Consumer<T>:消费型接口,void accept(T t)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void m1() {
    //原来的写法
    happyTime(500, new Consumer<Double>() {
        @Override
        public void accept(Double aDouble) {
            System.out.println("学习太累,去上人间买了瓶矿泉水,价格为:" + aDouble);
        }
    });

    //Lambda 表达式的写法
    happyTime(500, money -> System.out.println("学习太累,去天上人间买了瓶矿泉水,价格为:" + money));
}

public void happyTime(double money, Consumer<Double> consumer) {
    consumer.accept(money);
}

Supplier<T>:供给型接口,T get()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
public void m3() {
    //原来的写法
    List<Integer> numList = getNumList(10, new Supplier<Integer>() {
        @Override
        public Integer get() {
            return (int) (Math.random() * 100);
        }
    });
    System.out.println(numList);

    //Lambda 表达式的写法
    List<Integer> numListL = getNumList(10, () -> (int) (Math.random() * 100));
    System.out.println(numListL);
}

//需求:生成指定个数的整数,并放入集合中
public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
    List<Integer> arrayList = new ArrayList<>();
    for (int i = 0; i < num; i++) {
        Integer n = supplier.get();
        arrayList.add(n);
    }
    return arrayList;
}

Function<T, R>:函数型接口,R apply(T t)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void m4() {
    //原来的写法
    String s = sHandler("\t\t Vincent帅到掉渣...  ", new Function<String, String>() {
        @Override
        public String apply(String s) {
            return s.trim();
        }
    });
    System.out.println(s);

    //Lambda 表达式的写法
    String sL = strHandler("\t\t Vincent帅到掉渣...  ", str -> str.trim());
    System.out.println(sL);
}

//需求:用于处理字符串
public String sHandler(String str, Function<String, String> function) {
    return function.apply(str);
}

Predicate<T>:断言型接口,boolean test(T t)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Test
public void m2(){
    //原来的写法
    List<String> list = Arrays.asList("北京", "南京", "天津", "东京", "西京", "普京");
    List<String> filterStrs = filterString(list, new Predicate<String>() {
        @Override
        public boolean test(String s) {
            return s.contains("京");
        }
    });
    System.out.println(filterStrs);

    //Lambda 表达式的写法
    List<String> filterStrsL = filterString(list, s -> s.contains("京"));
    System.out.println(filterStrsL);
}

//需求:根据给定的规则,过滤集合中的字符串,此规则由 Predicate 的方法决定
public List<String> filterString(List<String> list, Predicate<String> predicate) {
    ArrayList<String> filterList = new ArrayList<>();
    for (String s : list) {
        if (predicate.test(s)) {
            filterList.add(s);
        }
    }
    return filterList;
}

标签:String,函数,接口,println,public,表达式,Lambda
From: https://blog.csdn.net/qq_24907431/article/details/137346791

相关文章

  • Python程序设计 魔法函数
    1.魔法方法Python中有一些特殊方法,它们允许我们的类和Python更好地集成。在标准库参考(StandardLibraryReference)中,它们被称为魔法方法(MagicMethods),是与Python的其他特性无缝集成的基础。例如,我们用字符串来表示一个对象的值。Object 基类包含了__repr__() 和__str__()......
  • Java登陆第三十八天——VUE3生命周期、钩子函数、组件拼接、组件传参(组件通信)
    生命周期之前在Servlet等也学习过生命周期,相同的,VUE组件也有生命周期。VUE组件完全解析到浏览器,会经过如下过程。(简单理解)vue组件被实例化的过程,称为,组件实例化。组件实例解析到浏览器中,称为,挂载。组件实例从浏览器中删除,称为,卸载。钩子函数vue组件解析到浏览器的......
  • 函数递归
    调用自身的编程技巧称为递归把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解把大事化小1,举例2,递归打印数字递归的两个必要条件存在限制条件,当满足这个条件时,递归便不在继续每次递归调用之后越来越接近这个限制条件3,递归模拟strlen函数  ......
  • Python简单函数循环综合实例
    importrandomprint("*"*71)print("*"*27+"欢迎来到名人猜猜猜"+"*"*27)print("*"*29+"Let'sbegining"+"*"*28)character_1='他是巨星'character_2='他是篮球健将'character_3='他身......
  • 接口,多态性,深层和浅层副本,密封类和异常。
    C#接口遥控器是观众和电视之间的接口。它是此电子设备的接口。外交礼仪指导外交领域的所有活动。道路规则是驾车者,骑自行车者和行人必须遵守的规则。编程中的接口类似于前面的示例。接口是:APIsContracts对象通过其公开的方法与外界交互。实际的实现对程序员而言并不......
  • C# 构造函数 (初始化成员变量的角色)
    构造函数是一种特殊的方法。创建对象时会自动调用它。构造函数不返回值。构造函数的目的是初始化对象的状态。构造函数与类具有相同的名称。构造函数是方法,因此它们也可以重载。构造函数不能被继承。它们按继承顺序被调用。如果我们不为类编写任何构造函数,则C#提供一个......
  • 2024年4月5日-UE5-朝向鼠标、怪物死亡、状态机、纯函数
    想要实现朝向鼠标方向射击,有个问题就是朝向是按之前设置的移动的时候角色按加速度方向去做朝向,比如按了A,角色往左边移动,如果不调整,再按射击就是依然只往左边移动和射击,不会对着鼠标方向只有站立的时候,才能按照鼠标方向射击,简单来说就是键盘和鼠标都用的时候会有冲突,这个时候就......
  • Oracle分组查询中包含子查询列,发生ORA-00937:不是单分组函数的错误
    selectsum(raw_ore)raw_ore,(selectsum(raw_ore0)fromtrv_dailywherep_year=a.p_year)lift_orefromtrv_refineawherep_year=2024尽管语句selectsum(raw_ore0)fromtrv_dailywherep_year=a.p_year,只返回一个数值,系统提示“ORA-00937:不是单分组函数......
  • python学习笔记——函数
     2. 函数****2.1. 定义****一段可以被另外一段代码执行的程序2.2. 语法****def函数名():函数体--语法return需要的返回值2.3. 调用****函数名()#定义函数*deftest_function():print('我是一个测试函数')#调用函数*ifname=='main':test_functi......
  • 回文素数----函数
    题目题目描述如果一个数即是回文数又是素数(质数)的话,则称这个数为回文素数。其中回文数的定义为,如果一个数从左边看和从右边看一样,则该数称为回文数。如数字12321就是个回文数。请输出从100~n的所有回文素数。输入格式一个整数n。输出格式从100~n的所有回文素数,空格......