java8新特性(3)--- 函数式接口

java8新特性(3)— 函数式接口

有且仅有一个抽象方法
package com.common.jdk8;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

// 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
public class Jdk8Test3 {
    public static void main(String[] args) {
        GreetingService greetingService = message -> System.out.println("Hello " + message);
        greetingService.sayMessage("xiaoming");
        greetingService.sayMessage("xiaoming2");
        greetingService.sayMessage("xiaoming3");
        greetingService.sayMessage("xiaoming4");

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // JDK 1.8 新增加的函数接口:java.util.function
        // Predicate也是这个包下的
        // Predicate <T> 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。

        // Predicate<Integer> predicate = n -> true
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // n 如果存在则 test 方法返回 true
        System.out.println("输出所有数据:");
        // 传递参数 n
        eval(list, n -> true);

        // Predicate<Integer> predicate1 = n -> n%2 == 0
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // 如果 n%2 为 0 test 方法返回 true
        System.out.println("输出所有偶数:");
        eval(list, n -> n % 2 == 0);

        // Predicate<Integer> predicate2 = n -> n > 3
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // 如果 n 大于 3 test 方法返回 true
        System.out.println("输出大于 3 的所有数字:");
        eval(list, n -> n > 3);

        //不用eval方法
        System.out.println("不用eval方法,输出大于 3 的所有数字:");
        list.stream().filter(n -> n > 3).forEach(System.out::println);


    }

    public static void eval(List<Integer> list, Predicate<Integer> predicate) {
        for (Integer n : list) {
            if (predicate.test(n)) {
                System.out.println(n + " ");
            }
        }
    }

    //和eval方法一样
    public static void eval2(List<Integer> list, Predicate<Integer> predicate) {
        list.stream().filter(predicate).forEach(System.out::println);
    }
}

//加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法
//@FunctionalInterface
interface GreetingService {
    //只能有这一个抽象方法,多了就报错了
    void sayMessage(String message);

    //函数式接口里是可以包含默认方法,因为默认方法不是抽象方法
    default void defaultMethod() {
        System.out.println("defaultMethod");
    }

    //函数式接口里可以包含静态方法,因为静态方法不是抽象方法
    static void printHello() {
        System.out.println("Hello");
    }

    //函数式接口里允许定义 java.lang.Object 里的 public 方法,这些方法不被看成所谓的抽象方法
    @Override
    boolean equals(Object obj);

}
运行结果
Hello xiaoming
Hello xiaoming2
Hello xiaoming3
Hello xiaoming4
输出所有数据:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
输出所有偶数:
2 
4 
6 
8 
10 
输出大于 3 的所有数字:
4 
5 
6 
7 
8 
9 
10 
不用eval方法,输出大于 3 的所有数字:
4
5
6
7
8
9
10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值