您的位置:首页 > 编程语言 > Java开发

你知道 jdk8新特性函数式接口吗?

2018-08-15 11:32 489 查看

本文目录:

1、什么是函数式接口?

2、自定义函数式接口

3、作为参数传递的Lanbda表达式

4、java内置四大核心函数式接口

5、其他接口

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

什么是函数式接口?

1)只包含一个抽象方法的接口,称为函数式接口。

2)可以通过Lambda表达式来创建该接口的对象(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。

3)我们可以在任意函数式接口上使用@FunctionalInterface注释,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

自定义函数式接口

[code]@FunctionalInterface
public interface MyFunction {
public String getValue(String str);
}

函数式接口中使用泛型
@FunctionalInterface
public interface MyFunction2<T,R> {
public R getValue2(T t,T T2);
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

作为参数传递Lambda表达式:

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

[code]@Test
public void test2(){

//       去除字符串首尾空格
String s = strHandler("\t\t\t\t\t大夫", (str) -> str.trim());
System.out.println(s);
//          把小写字母变成大写
String upper = strHandler("adsaff",(str -> str.toUpperCase()));
System.out.println(upper);
//            截取字符串 按下标 从0开始
String s1 = strHandler("满意点个赞,谢谢", (str) -> str.substring(1,4));
System.out.println(s1);
}

public String strHandler(String str,MyFunction mf){
return mf.getValue(str);
}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

[code]* java8 内置的四大核心接口
* Consumer<T>:消费性接口
*       void accept(T t);
* Supplier<T>:供给型接口
*       T get();
* Function<T,R>: 函数型接口
*       R apply(T t);
* Predicate<T> : 断言型接口
*       boolean test(T t);

1、Consumer<T>:消费性接口       传进一个参数 然后对该参数进行操作 没有返回值 操作了也就纯操作

      void accept(T t);

[code]@Test
public void run() {
happy(10000, (m) -> System.out.println("消费了" + m + "元"));
}

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

2、Supplier<T>:供给型接口        用于给你产生一些对象 你可以指定你要产生的对象类型

      void accept(T t);

[code]@Test
public void run2() {
List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
for (Integer integer : numList) {
System.out.println(integer);
}
}

//需求:产生指定个数的整数,并放入集合中
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;
}

3、Function<T,R>函数型接口:传进去一个传参数,返回一个参数,可以通过定义泛型对其类型进行操作

     R apply(T t);

[code]@Test
public void run3(){
//去除首尾空格
String s = strHandler("\t\t\t\t 九点三公分课程", (str) -> str.trim());
System.out.println(s);
//截取字符串
String s1 = strHandler("九点三公分课程", (str) -> str.substring(1, 5));
System.out.println(s1);
}
//需求:用于处理字符串
public String strHandler(String str, Function<String, String> function) {
return function.apply(str);
}

4、Predicate<T>: 断言型接口 用于一些做一些判断型操作

    boolean test(T t);

[code]@Test
public void run4(){
List<String> list = Arrays.asList("action","string","char","shore");
List<String> strings = filterStr(list, (s) -> s.length() > 5);
for (String s:strings) {
System.out.println(s);
}
}
//需求:将满足条件的字符串放入集合中
public List<String> filterStr(List<String> list, Predicate<String> pre){
List<String> list1 = new ArrayList<>();
for (String str:list) {
if (pre.test(str)){
list1.add(str);
}
}
return list1;
}
[code]---------------------------------------------------------------------------------------------------------------------------

其他接口

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: