Java 8 函数式编程接口

本贴最后更新于 2028 天前,其中的信息可能已经水流花落

最近看了 Java 8 的一些新特性,作为码农到现在都没有系统了解过 Java 8 实属惭愧。不过亡羊补牢为时不晚,现在就把学习中的知识点都记录下来。先从函数式编程开始。
以下都是最基本的用法

image.png

开始之前,先定义一个基本类,方便后面演示

class Dog {

	private String name = "哮天犬";

	private int food = 10;

	public Dog() {

	}

	public Dog(String name) {
		this.name = name;
	}

	public static void bark(Dog dog) {
		System.out.println(dog + "叫了");
	}

	public int eat(int num) {
		System.out.println("吃了" + num + "斤狗粮");
		this.food -= num;
		return this.food;
	}

	@Override
	public String toString() {
		return this.name;
	}
}

Predicate<T> 接口

断言函数,输入 T,返回 Boolean。

Predicate<Integer> predicate1 = i -> i < 10;
//IntPredicate predicate1 = i -> i < 10;// 等效写法
System.out.println(predicate1.test(11));// false
Predicate<Integer> predicate2 = i -> i > 8;
System.out.println(predicate1.and(predicate2).test(9));// true

Predicate<String> predicate3 = i -> i.equals("666");
System.out.println(predicate3.test("666"));// true

Consumer<T> 接口

消费函数,输入 T,没有输出,典型的消费者类型
先来看一个最简单的例子

Consumer<String> stringConsumer = System.out::println;
stringConsumer.accept("Hello World");	// Hello World

上面这个例子就不多说了,我们来看看下面这个略微有点复杂的例子

List<Integer> integers = new ArrayList<>();
Consumer<Integer> integerConsumer = integer -> {
    if (integer < 10){
        integers.add(integer);
    }
};
integerConsumer = integerConsumer.andThen(integer -> {
    integers.removeIf(predicate2.negate());
});
Stream.of(1,2,3,4,5,6,7,8,9,0,10).forEach(integerConsumer);
System.out.println(integers); // [9]

这个例子中使用了 Consumer<T> 接口中定义的 predicate2 断言函数取反,使用消费者函数筛选出了 8-10 之间的数。

Function<T,R> 接口

输入 T,输出 R

Function<Integer, Integer> times2 = i -> i*2;

Function<Integer, Integer> squared = i -> i*i;


System.out.println(times2.apply(4));

System.out.println(squared.apply(4));

//32                先4×4然后16×2,先执行apply(4),在times2的apply(16),先执行参数,再执行调用者。
System.out.println(times2.compose(squared).apply(4));

//64               先4×2,然后8×8,先执行times2的函数,在执行squared的函数。
System.out.println(times2.andThen(squared).apply(4));

//1024              先4*4,然后16*2,然后16*16
System.out.println(times2.andThen(squared).compose(squared).apply(4));

//16
System.out.println(Function.identity().compose(squared).apply(4));

以上例子涉及到了两个方法 andThencomposecompose 为之前执行,andThen 为之后。

Dog dog = new Dog();

IntFunction dogFunction = dog::eat;
System.out.println("还剩下" + dogFunction.apply(2) + "斤");

// 吃了2斤狗粮
// 还剩下8斤

Supplier<T> 接口

无输入,输出 T,典型的生产者模型

Supplier<Dog> supplier = Dog::new;
System.out.println("创建了新对象:" + supplier.get());

// 创建了新对象:哮天犬

UnaryOperator<T> 接口

输出、输入均为 T

Dog dog = new Dog();

UnaryOperator<Integer> function = dog::eat;
IntUnaryOperator function2 = dog::eat;

System.out.println("还剩下" + function.apply(2) + "斤");
System.out.println("还剩下" + function2.applyAsInt(2) + "斤");

// 吃了2斤狗粮
// 还剩下8斤
// 吃了2斤狗粮
// 还剩下6斤

BinaryOperator<T> 接口

输入为(T,T),返回为 T

BinaryOperator<String> binaryOperator = (s1,s2) -> s1 + "====" + s2;
System.out.println(binaryOperator.apply("a","b"));

// a====b

BiFunction<T> 接口

输入为(T,U),返回为 R

Dog dog = new Dog();
BiFunction<Dog, Integer, Integer> eatFunction = Dog::eat;
System.out.println("还剩下" + eatFunction.apply(dog, 2) + "斤");

//吃了2斤狗粮
//还剩下8斤
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3186 引用 • 8212 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...