Java8之Supplier、BinaryOperator

今天我学习了Java8的新的函数式接口—Supplier、BinaryOperator;接下来,我们来一个一个的分析它们的源码。

Supplier 源码分析

顾名思义,Supplier的意思是供应商、提供者的意思。

// 其中官方文档的意思是:
// 1.每次调用Supplier的时候不要求返回新的或者不同的值;
// 2.T 泛型代表的是 该供应商提供的结果类型,也是说他是不接收参数,
// 并返回值的
@FunctionalInterface
public interface Supplier<T>

下面看一下它的方法
源码:

// 不接收参数,返回一个值
T get();

示例分析:

public class Student {
    private String name ="liqin";
    private int age = 20;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
	// lambda表达式方法
	// 调用一个无参构造方法
	Supplier<Student> supplier = () -> new Student();
	System.out.println(supplier.get().getName());
	// supplier函数式接口不接受参数,返回一个结果
	// 方法引用方法
	Supplier<Student> supplier2 = Student::new;
	System.out.println(supplier2.get().getName());

这里有两种写法,第一种:是lambda表达式的写法;第二种是方法引用的写法。

lambda表达式的写法

因为函数式接口Supplier是一个不接收参数,返回一个值。所以lambda表达式的前半部分就应该是()的写法,那么为什么要在后面写 new Stundent(),
因为他需要实例出这个对象(并且必须是无参构造),才可以调用里面的getName()方法。而且我还发现了。

// Supplier<Student> supplier = () -> new Student();
// System.out.println(supplier.get().getName());
// 当你使用getName()方法时,编译器会自动提示你使用这种写法
public Student() {
        name = "liqin";
    }

方法引用不讲解,后面的文章我会讲解的
这就是Supplier 接口,感觉是不是很简单,但是它是Java8的四大函数式接口,是非常重要的,如果没看懂我写的,希望大家再去看看其他文章,一定要搞懂。

BinaryOperator 源码分析

打开源码,我并没有发现他有自己的抽象方法啊,他为什么也是函数式接口呢,仔细一看,因为他继承了BiFunction,也就是继承了apply()方法。那么他有什么特殊的呢?我们来了解一下。

// 简单地说:BinaryOperator是BiFunction 的一个特例,
// 即:BinaryOperator也接收三个参数,但是函数的参数和返回值是相同类型的,
// 所以,自定义了一个泛型 T。
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T>

那么接下来我们来分析一下BinaryOperator中抽象方法。

第一个方法 ----- apply 方法

源码:

// 等用于BiFunction中的apply方法 
R apply(T t, U u);

示例代码:

// 计算两个数的加减法,我觉得是对BinaryOperator接口的最好示例了,
// 之前也是使用过BiFunction实现,但是需要三个接口。
// 而BinaryOperator只需要定义一个类型就可以了,比较方便。
BinaryOperatorTest binaryOperatorTest = new BinaryOperatorTest();
System.out.println(binaryOperatorTest.add(1, 2, (a, b) -> a + b));
public Integer add(int a, int b, 
BinaryOperator<Integer> binaryOperator) {
        return binaryOperator.apply(a, b);
    }
第二个方法 ----- minBy(静态方法)

源码:

// 返回一个BinaryOperator对象,根据指定的比较规则(比较器),
// 用来返回两个元素最小的那一个。
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
        Objects.requireNonNull(comparator);
        return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
    }

示例代码:

// 输出结果:world
// minBy返回的是BinaryOperator对象,调用apply方法将两个参数传进去
// 进行比较,按比较规则输出。
BinaryOperatorTest binaryOperatorTest = new BinaryOperatorTest();
System.out.println(binaryOperatorTest.getShort("hello123", "world", (a, b) -> a.length() - b.length()));


	public String getShort(String a, String b, Comparator<String> comparator) {
        return BinaryOperator.minBy(comparator).apply(a, b);
    }

BinaryOperator还有一个静态方法----maxBy,跟minBy是相反的,搞懂了minBy,也就搞懂了maxBy,我也就不做讲解了。
maxBy源码

// 值得注意的是,comparator.compare(a, b) >= 0 ? a : b;
// 与minBy判断相反,其他地方都一样。
 public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
        Objects.requireNonNull(comparator);
        return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值