jdk8新特性之三函数式接口

引言

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。java8 新特性非常多,上一节介绍了Java8新特性中的方法引用,本小节继续讲解Java8的新特性之三:函数式接口用。

java8新特性

  1. jdk8新特性之一Lambda表达式
  2. jdk8新特性之二方法引用
  3. jdk8新特性之三函数式接口
  4. jdk8新特性之四默认方法
  5. jdk8新特性之五Stream API
  6. jdk8新特性之六Optional类
  7. jdk8新特性之七Nashorn JavaScript
  8. jdk8新特性之八日期时间API
  9. jdk8新特性之九Base64

函数式接口

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。

函数式接口可以用**@FunctionalInterface**注解标识。

@FunctionalInterface注解是对函数式接口的标识,他的作用是对接口进行编译级别的检查,如果一个接口使用了这个注解,但是写了两个抽象方法,会出现编译错误。

定义了一个函数式接口如下:

@FunctionalInterface
interface testService 
{
	void toMessage(String mes);
}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

TestService testService = message -> System.out.println("Hello " + message);
testService.toMessage("我是测试");
java.util.function

java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:

序号接口描述
1BiConsumer<T,U>代表了一个接受两个输入参数的操作,并且不返回任何结果
2BiFunction<T,U,R>代表了一个接受两个输入参数的方法,并且返回一个结果
3BinaryOperator代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4BiPredicate<T,U>代表了一个两个参数的boolean值方法
5BooleanSupplier代表了boolean值结果的提供方
6Consumer代表了接受一个输入参数并且无返回的操作
7DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。
9DoubleFunction代表接受一个double值参数的方法,并且返回结果
10DoublePredicate代表一个拥有double值参数的boolean值方法
11DoubleSupplier代表一个double值结构的提供方
12DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15Function<T,R>接受一个输入参数,返回一个结果。
16IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17IntConsumer接受一个int类型的输入参数,无返回值 。
18IntFunction接受一个int类型输入参数,返回一个结果 。
19IntPredicate接受一个int输入参数,返回一个布尔值的结果。
20IntSupplier无参数,返回一个int类型结果。
21IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25LongConsumer接受一个long类型的输入参数,无返回值。
26LongFunction接受一个long类型输入参数,返回一个结果。
27LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28LongSupplier无参数,返回一个结果long类型的值。
29LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32ObjDoubleConsumer接受一个object类型和一个double类型的输入参数,无返回值。
33ObjIntConsumer接受一个object类型和一个int类型的输入参数,无返回值。
34ObjLongConsumer接受一个object类型和一个long类型的输入参数,无返回值。
35Predicate接受一个输入参数,返回一个布尔值结果。
36Supplier无参数,返回一个结果。
37ToDoubleBiFunction<T,U>接受两个输入参数,返回一个double类型结果
38ToDoubleFunction接受一个输入参数,返回一个double类型结果
39ToIntBiFunction<T,U>接受两个输入参数,返回一个int类型结果。
40ToIntFunction接受一个输入参数,返回一个int类型结果。
41ToLongBiFunction<T,U>接受两个输入参数,返回一个long类型结果。
42ToLongFunction接受一个输入参数,返回一个long类型结果。
43UnaryOperator接受一个参数为类型T,返回值类型也为T。
函数式接口实例
Consumer

接口唯一的抽象方法是:`void accept(T t);
这是一个单参数,无返回值的方法,参数是泛型类。这个接口被称为消费型接口,因为没有返回值,接口里面干了什么和调用方没什么关系。
这种单参数无返回值的接口我们可以这么用Lambda表达式:

Consumer consumer=(par)->System.out.println(par);
consumer.accept("我是来测试Consumer");

输出结果是:

我是来测试Consumer
Supplier

接口唯一的抽象方法是:T get();
这是一个无参数,有返回值的方法,返回值类型是泛型类。这个接口被称作供给型接口。
这种无参数有返回值的方法我们可以这么用:

//供给型接口
Supplier<String> supplier=()-> new String("我是来测试Supplier");
String str=supplier.get();
System.out.println(str);

输出结果是:

我是来测试Supplier
ToIntFunction

接口唯一的抽象方法是:int applyAsInt(T value);
这是一个单参数,返回值为int的方法,参数类型是泛型类。

ToIntFunction<String> toIntFunction=(a) -> Integer.parseInt(a);
int i=toIntFunction.applyAsInt("123");
System.out.println("测试ToIntFunction,返回整数是:"+i);

输出结果是:

测试ToIntFunction,返回整数是:123
Predicate

接口唯一的抽象方法是:boolean test(java.lang.Object arg0);

package com.adanblog.demo;

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

/**
 * java8新特性之三函数接口
 * @author www.adanblog.com
 *
 */
public class FunctionTest2 {
	public static void main(String[] args) {
		List<Integer> list=Arrays.asList(1,2,3,4,5,6,7,8,9);
		// Predicate<Integer> predicate = n -> true
	    // n 是一个参数传递到 Predicate 接口的 test 方法
		
	    // n 如果存在则 test 方法返回 true  
	    System.out.println("输出所有数据:");
	    eval(list,n -> true);
	    

	    // 如果 n%2 为 0 test 方法返回 true
	    System.out.println("输出所有偶数:");
	    eval(list, n -> n%2 == 0);
	    
	    //如果 n 大于 3 test 方法返回 true
	    System.out.println("输出所有大于3的数字:");
	    eval(list, n -> n>3);
	}
	
	public static void eval(List<Integer> list,Predicate<Integer> predicate) {
		for (Integer n : list) {
			if(predicate.test(n)) {
				System.out.println(n+" ");
			}
		}
	}
}

输出结果是:

输出所有数据:
1 
2 
3 
4 
5 
6 
7 
8 
9 
输出所有偶数:
2 
4 
6 
8 
输出所有大于3的数字:
4 
5 
6 
7 
8 
9 

关于阿丹博客

以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的 >建议,欢迎留言批评指正,不吝感激。
下面阿丹的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛。

个人博客:http://www.adanblog.com/

GitHub:https://github.com/adanblog/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值