(原)
这个接口很简单,里面只有一个抽象方法,没有default和静态方法。
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.util.function;
/**
* Represents a supplier of results.
*代表了一个供应的结果
* <p>There is no requirement that a new or distinct result be returned each
* time the supplier is invoked.
* 没有要求supplier 被调用以后都需要返回一个新的或者不同的结果
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #get()}.
*这是一个方法为get的函数式接口
* @param <T> the type of results supplied by this supplier
*
* @since 1.8
*/
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
如果前面几篇看过了,那么这个会很简单。不接收参数,返回的类型随调用者控制,这个有点类似于不接收参数的工厂模式。
然后有一个与之相关的,返回int类型的函数式接口,叫IntSupplier,
它里面的方法是这样的。
/*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.util.function;
/**
* Represents a supplier of {@code int}-valued results. This is the
* {@code int}-producing primitive specialization of {@link Supplier}.
*
* <p>There is no requirement that a distinct result be returned each
* time the supplier is invoked.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #getAsInt()}.
*
* @see Supplier
* @since 1.8
*/
@FunctionalInterface
public interface IntSupplier {
/**
* Gets a result.
*
* @return a result
*/
int getAsInt();
}
IntSupplier 和Supplier差不多,只不过它限定了返回值为int类型。
由于这个篇幅过短,跳跃性的再介绍一个接口BinaryOperator
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.util.function;
import java.util.Objects;
import java.util.Comparator;
/**
* Represents an operation upon two operands of the same type, producing a result
* of the same type as the operands. This is a specialization of
* {@link BiFunction} for the case where the operands and the result are all of
* the same type.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #apply(Object, Object)}.
*
* @param <T> the type of the operands and result of the operator
*
* @see BiFunction
* @see UnaryOperator
* @since 1.8
*/
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
/**
* Returns a {@link BinaryOperator} which returns the lesser of two elements
* according to the specified {@code Comparator}.
*
* @param <T> the type of the input arguments of the comparator
* @param comparator a {@code Comparator} for comparing the two values
* @return a {@code BinaryOperator} which returns the lesser of its operands,
* according to the supplied {@code Comparator}
* @throws NullPointerException if the argument is null
*/
public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;
}
/**
* Returns a {@link BinaryOperator} which returns the greater of two elements
* according to the specified {@code Comparator}.
*
* @param <T> the type of the input arguments of the comparator
* @param comparator a {@code Comparator} for comparing the two values
* @return a {@code BinaryOperator} which returns the greater of its operands,
* according to the supplied {@code Comparator}
* @throws NullPointerException if the argument is null
*/
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
}
由于之前花了大篇幅讲过Function,BiFunction,这个doc就不解释。直接看源码。
BinaryOperator<T> extends BiFunction<T,T,T>
BinaryOperator继承于BiFunction ,我们知道BiFunction是接收二个参数,返回一个结果,而BinaryOperator只有一个参数T,那么它的方法apply的传入参数和返回结果都是相同类型。它里面有二个静态方法,minBy和maxBy用来作比较的。minBy比较出较大的一个,maxBy比较出较小的一个。
下面给个例子测试一下结果。
package com.demo.jdk8;
import java.util.Comparator;
import java.util.function.BinaryOperator;
import java.util.function.IntSupplier;
import java.util.function.Supplier;
public class Test5 {
public static void main(String[] args) {
System.out.println("part1---------------------");
Supplier<Test5Class> s = () -> new Test5Class("hello", 14);
System.out.println(s.get().getName() + "=" + s.get().getAge());
System.out.println("part2---------------------");
IntSupplier ss = () -> 99;
System.out.println(ss.getAsInt());
System.out.println("part3---------------------");
System.out.println(getMin(3,6 , (a,b) -> a - b));
System.out.println("part4---------------------");
System.out.println(getMax(3,6 , (a,b) -> a - b));
}
public static int getMin(int a ,int b,Comparator<Integer> c){
return BinaryOperator.minBy(c).apply(a, b);
}
public static int getMax(int a ,int b,Comparator<Integer> c){
return BinaryOperator.maxBy(c).apply(a, b);
}
}
class Test5Class{
private String name;
private int age;
public Test5Class(String name,int age){
this.name = name;
this.age = age;
}
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;
}
}