美文网首页
Java 8:函数式接口

Java 8:函数式接口

作者: RealityVibe | 来源:发表于2019-10-05 17:36 被阅读0次

常用的函数式接口

@FunctionalInterface注解

这个标注用于表示该接口会设计成一个函数式接口。如果你用@FunctionalInterface定义了一个接口,而它却不是函数式接口的话,编译器将返回一个提示原因的错误。

在函数式接口中只能存在一个抽象方法,以及若干个default方法

Function

定义

T -> R 接受一个泛型T的对象作为入参,并返回一个泛型R的对象

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

应用实例

/**
 *  在流运算中的map函数的入参类型就是Function
 *  <R> Stream<R> map(Function<? super T, ? extends R> mapper);
 */
List<Integer> list = apples.stream().map(Apple::getWeight).collect(toList());

拓展

Java 8同样提供两个入参的BiFunction((T, U)-> R) (也可以根据自己的需求去自定义N个入参的Function函数式接口,下同),以及针对类型转化效率更高的DoubleFunction、IntFunction等。

Consumer

定义

T -> void 接受一个泛型T类型的参数,无返回值

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

应用实例

 /**
  *  遍历每个对象打印颜色color
  *  forEach的入参就是Consumer类型
  *  default void forEach(Consumer<? super T> action) {
  */
 apples.forEach(apple->System.out.println(apple.getColor))

Precidate

定义

T -> boolean 接受一个泛型T的入参,返回boolean

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

应用实例

 /**
  *  过滤apples中为Null的对象 
  *  filter的入参就是Predicate类型
  *  Stream<T> filter(Predicate<? super T> predicate);
  */
 apples.stream().filter(Objects::nonNull).collect(toList());

Supplier

定义

() -> R 无参函数,返回一个泛型R的对象

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

应用实例-Supplier实现工厂模式

public class RebuildFactoryWithSupplier {
    final static Map<String, Supplier<Fruit>> fruitMap = new HashMap();

    static {
        fruitMap.put("watermelon", Watermelon::new);
        fruitMap.put("balana", Banana::new);
        fruitMap.put("apple", Apple::new);
    }

    ;

    public static void main(String[] args) {
        RebuildFactoryWithSupplier factory = new RebuildFactoryWithSupplier();
        factory.getFruit("apple").getWeight();
    }

    public Fruit getFruit(String fruitName) {
        Fruit fruit = fruitMap.get(fruitName).get();
        if (fruit == null) {
            throw new IllegalArgumentException("No such product " + fruitName);
        }
        return fruit;
    }
}

类型检查

Lambda表达式的类型检查过程

相关文章

  • Java 8 Function函数式接口

    Java 8 Function函数式接口 介绍 函数式接口其实就是一个抽象接口类,在Java 8之前已有的函数式接...

  • JAVA8函数式接口学习

    JAVA8函数式接口 函数式接口是java8的一种新特性,函数式接口定义了且只定义了一个抽象方法!该接口非常有用,...

  • Java 函数式接口

    Java 函数式接口 这个术语首先出自于 Java 8。Java 里的函数式接口 指的是一个接口只包含一个抽象方法...

  • Java8-函数式接口

    什么是函数式接口 ​ Java 8引入了函数式接口的概念 ​ 1). 只包含一个抽象方法的接口,称为函数式...

  • JAVA 8 函数式接口--Consumer

    原文地址:《JAVA 8 函数式接口--Consumer》 从JDK8开始java支持函数式编程,JDK也提供了几...

  • Java8-Functional Interfaces函数式接口

    Java8-Functional Interfaces函数式接口 1 Java 8-概述2 Java 8 - La...

  • 02 Java-Lambda-Java 8 自带的函数接口

    Java 8 自带的函数接口 我们使用lambda在处理自己定义的业务时,需要自定义函数式接口,其实java8已经...

  • Java lambda表达式

    1. Java函数式接口 Java实现函数式编程的方式是函数式接口(functional interface),函...

  • JAVA 8 函数式接口--Predicate

    从JDK8开始java支持函数式编程,JDK也提供了几个常用的函数式接口,这篇主要介绍Predicate接口。文本...

  • 函数式接口

    函数式接口 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! 函数式接口(Functional...

网友评论

      本文标题:Java 8:函数式接口

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