Java 8 新特性:5-Supplier、IntSupplier、BinaryOperator接口

(原)

这个接口很简单,里面只有一个抽象方法,没有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;
	}

}

  

时间: 2024-12-28 00:51:34

Java 8 新特性:5-Supplier、IntSupplier、BinaryOperator接口的相关文章

Java 8新特性前瞻

快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年java 5发布以来的java世界中最大的事件了.它带来了java语言层面上的诸多改变,主要包括下面一些方面:语法.编译器.库.工具和运行时. 一,语法层面: 1,Lambda表达式. lambda表达式是一种可调用对象,它允许我们将函数作为函数参数传入.诸如C++.Groovy.Scala都已经支持la

Java 8 新特性 – 终极手册整理

1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景. 本教程由下面几部分组成,它们分别涉及到Java平台某一特定方面的内容: 语言 编译器 类库 开发工具 运行时(Java虚拟机) 2.Java的新特性 总体来说,Java 8是一个大的版本升级.有人可能会说,Java 8的新特性非常令人

【整理】Java 8新特性总结

闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS 版本,和过去的 Java 大版本升级不同,它们只有半年左右的开发和维护期.而未来的 Java11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本(得到 Oracle 等商业公司的长期支持服务).所以Java 8 就成了最新的一次LTS版本升级,这也是为什么Java开发者对J

Java 8 新特性概述

Oracle 在 2014 年 3 月发布了 Java 8 正式版,该版本是一个有重大改变的版本,对 JAVA 带来了诸多新特性.其中主要的新特性涵盖:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等.本文将对 Java 8 中几个重要新特性进行介绍. 函数式接口 Java 8 引入的一个核心概念是函数式接口(Functional Interfaces).通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行.如果一个接口

Java 5/Java 6/Java7/Java 8新特性收集

前言: Java 8对应的JDK版本为JDK8,而官网下载回来安装的时候,文件夹上写的是JDK1.8,同一个意思.(而这个版本命名也是有规律的,以此类推) 一.Java 5 1.https://segmentfault.com/a/1190000004417288 二.Java 6 2.https://segmentfault.com/a/1190000004417536 三.Java 7 1.http://www.eclipse.org/jdt/ui/r3_8/Java7news/whats-

Java 8新特性之旅:使用Stream API处理集合

在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda表达式增强方法”中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组创建流. 聚合流中的值. 1.

Java 8 新特性1-函数式接口

Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class Test2 { public static void main(String[] args) { for_test

Java 5/Java 6/Java7/Java 8新特性收集(转载)

Java 8对应的JDK版本为JDK8,而官网下载回来安装的时候,文件夹上写的是JDK1.8,同一个意思.(而这个版本命名也是有规律的,以此类推) 一.Java 5 1.https://segmentfault.com/a/1190000004417288 二.Java 6 2.https://segmentfault.com/a/1190000004417536 三.Java 7 1.http://www.eclipse.org/jdt/ui/r3_8/Java7news/whats-new-

Java 8新特性探究(八)精简的JRE详解

http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 Java 8新特性探究(八)精简的JRE详解 2015/02/05 | 分类: 基础技术 | 0 条评论 | 标签: JRE 分享到:2 原文出处: 成熟的毛毛虫的博客 Oracle公司如期发布了Java 8正式版!没有让广大javaer失望.对于