Java8函数式接口和Lambda表达式

简介: 本文介绍Java8函数式接口和Lambda表达式的内容

@FunctionalInterface注解的函数式接口

@FunctionalInterface
interface IService {
    void say(String message);
}

public class FunctionalInterfaceTest {
    public static void main(String[] args) {
        IService serviceObj = message -> System.out.println("Hello, " + message);
        serviceObj.say("Sam");
    }
}

输出结果:

Hello, Sam

Java8前已有的函数式接口

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

Java8新增的java.util.function

内含43个函数式接口,如下:

Interface Description
BiConsumer<T,U> 代表了一个接受两个输入参数的操作,并且不返回任何结果
BiFunction<T,U,R> 代表了一个接受两个输入参数的方法,并且返回一个结果
BinaryOperator 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
BiPredicate<T,U> 代表了一个两个参数的boolean值方法
BooleanSupplier 代表了boolean值结果的提供方
Consumer 代表了接受一个输入参数并且无返回的操作
DoubleBinaryOperator 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果
DoubleConsumer 代表一个接受double值参数的操作,并且不返回结果
DoubleFunction 代表接受一个double值参数的方法,并且返回结果
DoublePredicate 代表一个拥有double值参数的boolean值方法
DoubleSupplier 代表一个double值结构的提供方
DoubleToIntFunction 接受一个double类型输入,返回一个int类型结果
DoubleToLongFunction 接受一个double类型输入,返回一个long类型结果
DoubleUnaryOperator 接受一个参数同为类型double,返回值类型也为double
Function<T,R> 接受一个输入参数,返回一个结果
IntBinaryOperator 接受两个参数同为类型int,返回值类型也为int
IntConsumer 接受一个int类型的输入参数,无返回值
IntFunction 接受一个int类型输入参数,返回一个结果
IntPredicate 接受一个int输入参数,返回一个布尔值的结果
IntSupplier 无参数,返回一个int类型结果
IntToDoubleFunction 接受一个int类型输入,返回一个double类型结果
IntToLongFunction 接受一个int类型输入,返回一个long类型结果
IntUnaryOperator 接受一个参数同为类型int,返回值类型也为int
LongBinaryOperator 接受两个参数同为类型long,返回值类型也为long
LongConsumer 接受一个long类型的输入参数,无返回值
LongFunction 接受一个long类型输入参数,返回一个结果
LongPredicate R接受一个long输入参数,返回一个布尔值类型结果
LongSupplier 无参数,返回一个结果long类型的值
LongToDoubleFunction 接受一个long类型输入,返回一个double类型结果
LongToIntFunction 接受一个long类型输入,返回一个int类型结果
LongUnaryOperator 接受一个参数同为类型long,返回值类型也为long
ObjDoubleConsumer 接受一个object类型和一个double类型的输入参数,无返回值
ObjIntConsumer 接受一个object类型和一个int类型的输入参数,无返回值
ObjLongConsumer 接受一个object类型和一个long类型的输入参数,无返回值
Predicate 接受一个输入参数,返回一个布尔值结果
Supplier 无参数,返回一个结果
ToDoubleBiFunction<T,U> 接受两个输入参数,返回一个double类型结果
ToDoubleFunction 接受一个输入参数,返回一个double类型结果
ToIntBiFunction<T,U> 接受两个输入参数,返回一个int类型结果
ToIntFunction 接受一个输入参数,返回一个int类型结果
ToLongBiFunction<T,U> 接受两个输入参数,返回一个long类型结果
ToLongFunction 接受一个输入参数,返回一个long类型结果
UnaryOperator 接受一个参数为类型T,返回值类型也为T

函数式接口用法

Consumer

import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Consumer传入一个对象,BiConsumer传入两个对象,实质都是对传入的T实体进行操作处理
 */
public class ConsumerDemo {

    public static void main(String[] args) {
        Consumer<String> consumer = System.out::println;
        consumer.accept("hello");
        BiConsumer<Integer, Integer> biConsumer = (a, b) -> System.out.println(a + "+" + b + "=" + (a + b));
        biConsumer.accept(3, 4);
    }

}

Function

import java.util.function.Function;

/**
 * Function实际上是对类型T实体进行相应的操作并返回类型为R的实体
 */
public class FunctionDemo {

    private static class OrderItem {
        double unitPrice;
        int count;

        public OrderItem(double unitPrice, int count) {
            this.unitPrice = unitPrice;
            this.count = count;
        }

        public double getPrice() {
            return unitPrice * count;
        }
    }

    public static void main(String[] args) {
        Function<OrderItem, Double> function = OrderItem::getPrice;
        OrderItem orderItem = new OrderItem(12.0, 5);
        System.out.printf("%.2f", function.apply(orderItem));
    }

}

Predicate

/**
 * Predicate确定实体T是否满足约束,返回boolean
 */
public class PredicateDemo {

    public static void main(String[] args) {
        Predicate<String> predicate = s -> s.length() < 20;
        System.out.println(predicate.test("123456"));
        System.out.println(predicate.test("1234567890123456789012"));
    }

}

Supplier

import java.util.function.Supplier;

/**
 * Supplier实际是创建了T实体并返回
 */
public class SupplierDemo {

    private static class Student {
        int id;
        String name;

        Student() {
            this.id = 0;
            this.name = "";
        }

        Student(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "Student{" + "id=" + id + ", name='" + name + '\'' + '}';
        }
    }

    public static void main(String[] args) {
        Supplier<Student> supplier1 = Student::new;
        System.out.println(supplier1.get());
        Supplier<Student> supplier2 = () -> new Student(123, "Sam");
        System.out.println(supplier2.get());
    }

}
相关文章
|
14天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
5天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
23 1
|
14天前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第37天】本文将带你深入理解Java的Lambda表达式,从基础语法到高级特性,通过实例讲解其在函数式编程中的应用。我们还将探讨Lambda表达式如何简化代码、提高开发效率,并讨论其在实际项目中的应用。
|
16天前
|
Java API
Java中的Lambda表达式与函数式编程####
【10月更文挑战第29天】 本文将深入探讨Java中Lambda表达式的实现及其在函数式编程中的应用。通过对比传统方法,我们将揭示Lambda如何简化代码、提高可读性和维护性。文章还将展示一些实际案例,帮助读者更好地理解和应用Lambda表达式。 ####
|
16天前
|
JSON 自然语言处理 Java
这款轻量级 Java 表达式引擎,真不错!
AviatorScript 是一个高性能、轻量级的脚本语言,基于 JVM(包括 Android 平台)。它支持数字、字符串、正则表达式、布尔值等基本类型,以及所有 Java 运算符。主要特性包括函数式编程、大整数和高精度运算、完整的脚本语法、丰富的内置函数和自定义函数支持。适用于规则判断、公式计算、动态脚本控制等场景。
|
15天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
32 1
|
21天前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####
|
9天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
8天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
下一篇
无影云桌面