二、函数式接口

什么是函数式接口
(1)只包含一个抽象方法的接口,称为函数式接口。
(2)你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
(3)我们可以在任意函数式接口上使用@FunctionalIntegerface注解,这样做可以检查他是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

自定义函数式接口

package com.chentongwei.java8.day02;

/**
 * 最基本的函数式接口
 * @author TongWei.Chen
 */
@FunctionalInterface
public interface MyFun {
    double getValue();
}
package com.chentongwei.java8.day02;

/**
 * 函数式接口中使用泛型
 * @author TongWei.Chen
 */
@FunctionalInterface
public interface MyFun2 {
    T getValue(R r);
}

函数式接口作为参数传递给Lambda表达式

package com.chentongwei.java8.day02;

import org.junit.Test;

/**
 * 函数式接口当参数传递给Lambda表达式
 * @author TongWei.Chen
 */
public class TestFunc {
    
    public double getValue(int num, MyFun fun) {
        return fun.getValue(num);
    }
    
    @Test
    public void test() {
        double value = getValue(100, x -> x / 4);
        System.out.println(value);
    }
}

作为参数传递Lambda表达式,为了将Lambda表达式作为参数传递,接收lambda表达式的参数类型必须是与该Lambda表达式兼容的函数式接口的类型。
很少有人自己手写函数式接口,因为Java把基本的函数式接口都提供了,我们只需要直接用即可。

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

二、函数式接口_第1张图片
Paste_Image.png

简单的Demo演示

package com.chentongwei.java8.day03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.junit.Test;

/**
 * Java8内置四大核心函数式接口
 * 
 * Consumer : 消费型接口
 *      void accept(T t);
 * 
 * Supplier : 供给型接口
 *      T get();
 * 
 * Function : 函数型接口
 *      R apply(T t);
 * 
 * Predicate : 断言型接口
 *      boolean test(T t);
 * 
 * @author TongWei.Chen
 * @date 2017年3月31日21:31:48
 */
public class TestFunction {
    
    //测试消费型接口
    @Test
    public void test1() {
        happy(100, x -> System.out.println(x));
    }
    
    //消费型接口
    public void happy(double money, Consumer consumer) {
        consumer.accept(money);
    }
    
    //测试供给型接口
    @Test
    public void test2() {
        //生成10个随机数
        List list = getNumList(10, () -> (int)(Math.random() * 100));
        for(Integer integer : list) {
            System.out.println(integer);
        }
    }
    
    /**
     * 供给型接口
     * 产生指定个数的整数并放入集合中
     * 
     * @param num:生成数字的个数
     * @param supplier
     * @return
     */
    public List getNumList(int num, Supplier supplier) {
        List list = new ArrayList<>();
        for(int i = 0; i < num; i ++) {
            Integer n = supplier.get();
            list.add(n);
        }
        return list;
    }
    
    //测试函数型接口
    @Test
    public void test3() {
        String str1 = getString("\t\t\t 我爱Java,Java使我快乐。", (str) -> str.trim());
        System.out.println("去完空格后的字符串:" + str1);
        
        System.out.println("--------------------------------------------------------");
        
        String str2 = getString("我爱Java,Java使我快乐。", str -> str.substring(0, 6));
        System.out.println("截取后的字符串:" + str2);
    }
    
    //需求:处理各种字符串
    //函数型接口
    public String getString(String str, Function function) {
        return function.apply(str);
    }
    
    //测试断言型接口
    @Test
    public void test4() {
        List list = Arrays.asList("Hello", "tongwei", "Lambda", "www", "ok");
        //假设长度大于3就算满足条件
        List strList = filterStr(list, str -> str.length() > 3);
        
        for(String str : strList) {
            System.out.println(str);
        }
    }
    
    //断言型接口
    //需求:将满足条件的字符串,放入集合中
    public List filterStr(List list, Predicate pre) {
        List strings = new ArrayList<>();
        for(String str : list) {
            if(pre.test(str)) {
                strings.add(str);
            }
        }
        return strings;
    }
}

其他内置函数式接口

二、函数式接口_第2张图片
Paste_Image.png

此处没有Demo演示,是因为照猫画虎也能搞出来。

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg

你可能感兴趣的:(二、函数式接口)