二函数式接口
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表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口