美文网首页Java 杂谈
JAVA8 中的高阶函数

JAVA8 中的高阶函数

作者: 017830d97951 | 来源:发表于2016-11-24 18:24 被阅读0次

A Few Hidden Treasures in Java 8 on YouTube
是一个很有意思的视频。

函数式编程有一个很大的特点就是高阶函数。在很多”函数式“ 语言中,“函数”都是”第一公民“,就是说,函数可以像整数,浮点数,字符串等等普通值一样,可以作为函数的参数,也可以作为成员变量,函数的返回值。

在 JAVA 中,函数当然不是第一公民,函数是只有一个虚成员函数的接口。

如果一个函数的的参数是函数,或者返回值是函数,那么这个函数就是高阶函数。

任何非静态成员函数都可以看成一个函数,第一个参数是 this

下面是一个例子

public class SortPersonTest {
    public static List<Person> createPeople() {
        return Arrays.asList(
                new Person("Sara", Person.Gender.FEMALE, 20),
                new Person("Sara", Person.Gender.FEMALE, 22),
                new Person("Bob", Person.Gender.MALE, 20),
                new Person("Paula", Person.Gender.FEMALE, 32),
                new Person("Paul", Person.Gender.MALE, 32),
                new Person("JACk", Person.Gender.MALE, 2),
                new Person("JACK", Person.Gender.MALE, 72),
                new Person("Jill", Person.Gender.FEMALE, 12));
    }

    public static void main(String[] args) {

        createPeople().stream().sorted(
                Comparator.comparing(Person::getGender)
                        .reversed()
                        .thenComparing(Person::getAge)
                        .thenComparing(Person::getName))
                .forEach(System.out::println);
    }
}

程序输出

Person(name=Jill, gender=FEMALE, age=12)
Person(name=Sara, gender=FEMALE, age=20)
Person(name=Sara, gender=FEMALE, age=22)
Person(name=Paula, gender=FEMALE, age=32)
Person(name=JACk, gender=MALE, age=2)
Person(name=Bob, gender=MALE, age=20)
Person(name=Paul, gender=MALE, age=32)
Person(name=JACK, gender=MALE, age=72)

sorted 是一个高阶函数,第一个参数是 Stream this 。第二个参数是一个 Comparator 接口,这个接口只有一个虚函数,所以可以认为把一个函数作为参数。

Comparator::comparing 也是一个高阶函数,第一个参数是一个函数(Function),返回值也是一个函数(Comparator)。 类似实现可以是

    interface MyComparator<T> extends Comparator<T> {};
    public static <T, U extends Comparable<? super U>>
    MyComparator<T> comparing( Function<? super T, ? extends U> fKey) {
        return (t1, t2) -> fKey.apply(t1).compareTo(fKey.apply(t2));
    }

请忽略 Generic 的部分,这个不是本文的重点。

reversed 同样也是一个高阶函数,第一个函数是 Comparator (this) ,返回值还是一个函数 (Comparator),reversed 的实现可以类似下面

        default MyComparator<T> myReversed(){
            return (t1,t2) -> this.compare(t2,t1);
        }

thenComparing 的实现类似下面的代码

         default <U extends Comparable<? super U>> MyComparator<T> myThenComparing(Function<? super T, ? extends U> fKey) {
            return (t1, t2) -> {
                final int r1 = compare(t1, t2);
                return r1 == 0 ? myComparing(fKey).compare(t1,t2): r1;
            };
        }

完整代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

public class SortPersonTest {
    public static List<Person> createPeople() {
        return Arrays.asList(
                new Person("Sara", Person.Gender.FEMALE, 20),
                new Person("Sara", Person.Gender.FEMALE, 22),
                new Person("Bob", Person.Gender.MALE, 20),
                new Person("Paula", Person.Gender.FEMALE, 32),
                new Person("Paul", Person.Gender.MALE, 32),
                new Person("JACk", Person.Gender.MALE, 2),
                new Person("JACK", Person.Gender.MALE, 72),
                new Person("Jill", Person.Gender.FEMALE, 12));
    }
    interface MyComparator<T> extends Comparator<T> {
        default MyComparator<T> myReversed(){
            return (t1,t2) -> this.compare(t2,t1);
        }
        default <U extends Comparable<? super U>> MyComparator<T> myThenComparing(Function<? super T, ? extends U> fKey) {
            return (t1, t2) -> {
                final int r1 = compare(t1, t2);
                return r1 == 0 ? myComparing(fKey).compare(t1,t2): r1;
            };
        }
    };

    public static <T, U extends Comparable<? super U>>
    MyComparator<T> myComparing(Function<? super T, ? extends U> fKey) {
        return (t1, t2) -> fKey.apply(t1).compareTo(fKey.apply(t2));
    }
    public static void main(String[] args) {

        createPeople().stream().sorted(
                myComparing(Person::getGender)
                        .myReversed()
                        .myThenComparing(Person::getAge)
                        .myThenComparing(Person::getName))
                .forEach(System.out::println);
    }
}

相关文章

  • Java8函数式编程-高阶函数

    在《Java8函数式编程》第三章提到一个高阶函数的概念。引用原文的解释 高阶函数是指接受另外一个函数作为参数,或者...

  • JAVA8 中的高阶函数

    A Few Hidden Treasures in Java 8 on YouTube 是一个很有意思的视频。 函...

  • Kotlin 之旅5--高阶函数

    高阶函数的基本概念 类似于数学中的高阶函数f(g(x)),高阶函数的概念是: 在Kotlin中,函数可以自由传递、...

  • Kotlin 高阶函数详解

    高阶函数 在 Kotlin 中,函数是一等公民,高阶函数是 Kotlin 的一大难点,如果高阶函数不懂的话,那么要...

  • JavaScript之高阶函数

    高阶函数英文叫Higher-order function。那么什么是高阶函数?在数学和计算机科学中,高阶函数是至少...

  • Python笔记四 装饰器

    装饰器 = 高阶函数+函数嵌套+闭包 高阶函数 = 参数 or 返回值为函数 函数嵌套 = 在函数中定义函数 闭包...

  • Java 高阶函数

    一个高阶函数是指 一个函数使用函数作为参数或者执行完返回函数。在高阶函数教程中我将列举几个 Java 高阶函数的例...

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • Swift 高阶函数

    高阶函数的定义: 在 Wikipedia 中,是这么定义高阶函数(higher-order function)的,...

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

网友评论

    本文标题:JAVA8 中的高阶函数

    本文链接:https://www.haomeiwen.com/subject/lcabpttx.html