二函数式接口

Posted Java码农社区

tags:

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

什么是函数式接口
(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, R> {
    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内置四大核心函数式接口


简单的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<T> : 消费型接口
 *      void accept(T t);
 * 
 * Supplier<T> : 供给型接口
 *      T get();
 * 
 * Function<T, R> : 函数型接口
 *      R apply(T t);
 * 
 * Predicate<T> : 断言型接口
 *      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<Double> consumer) {
        consumer.accept(money);
    }
    
    //测试供给型接口
    @Test
    public void test2() {
        //生成10个随机数
        List<Integer> list = getNumList(10, () -> (int)(Math.random() * 100));
        for(Integer integer : list) {
            System.out.println(integer);
        }
    }
    
    /**
     * 供给型接口
     * 产生指定个数的整数并放入集合中
     * 
     * @param num:生成数字的个数
     * @param supplier
     * @return
     */
    public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
        List<Integer> 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<String, String> function) {
        return function.apply(str);
    }
    
    //测试断言型接口
    @Test
    public void test4() {
        List<String> list = Arrays.asList("Hello", "tongwei", "Lambda", "www", "ok");
        //假设长度大于3就算满足条件
        List<String> strList = filterStr(list, str -> str.length() > 3);
        
        for(String str : strList) {
            System.out.println(str);
        }
    }
    
    //断言型接口
    //需求:将满足条件的字符串,放入集合中
    public List<String> filterStr(List<String> list, Predicate<String> pre) {
        List<String> strings = new ArrayList<>();
        for(String str : list) {
            if(pre.test(str)) {
                strings.add(str);
            }
        }
        return strings;
    }
}

其他内置函数式接口


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


以上是关于二函数式接口的主要内容,如果未能解决你的问题,请参考以下文章

[二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

二函数式接口全面剖析

Java学习笔记3.9.2 Lambda表达式 - 函数式接口

java8新特性学习二(函数式functional接口)

java8新特性学习二(函数式functional接口)

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