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());
    }

}
相关文章
|
3天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
3天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
13 2
|
4天前
|
NoSQL Java API
java一行代码实现RESTFul接口
Spring Data REST是构建在Spring Data之上的库,可自动将repository转换为REST服务,支持JPA、MongoDB、Neo4j、GemFire和Cassandra。无需手动创建Service和Controller层。要开始,需配置JPA数据源,创建实体类和Repository接口。快速实现REST接口,只需引入spring-boot-starter-data-rest Maven依赖,并在Repository接口上添加@RepositoryRestResource注解。
|
4天前
|
Java
java lambda 表达式中的双冒号和箭头的用法
java lambda 表达式中的双冒号和箭头的用法
|
5天前
|
Java API
Java 8新特性之Lambda表达式详解
【4月更文挑战第29天】本文将深入探讨Java 8中引入的Lambda表达式,这是Java历史上的一次重大变革。我们将详细解析Lambda表达式的基本概念,语法结构,以及如何在实际编程中应用。此外,我们还将探讨Lambda表达式与函数式接口的关系,以及它如何改变我们编写和理解Java代码的方式。
|
5天前
|
Java 程序员 数据格式
关于Java抽象类和接口的总结和一点个人的看法
关于Java抽象类和接口的总结和一点个人的看法
|
7天前
|
并行计算 Java API
【专栏】Java中的Lambda表达式应用与实例解析
【4月更文挑战第27天】Java 8的Lambda表达式增强了函数式编程,允许以匿名函数形式传递行为。其基本语法`(params) -&gt; expression/statements`,类型由参数推断,可引用final或effectively final的外部变量。Lambda广泛应用于集合操作(如Stream API)、并行流处理和GUI事件处理,简化代码并提高效率。通过实例,展示了Lambda在集合筛选、并行计算和事件处理中的应用,从而提高开发质量和效率。
|
2月前
|
分布式计算 Java API
Java 8新特性之Lambda表达式和Stream API
【2月更文挑战第18天】随着Java 8的发布,Lambda表达式和Stream API成为了Java开发者的新宠。本文将详细介绍Lambda表达式的基本语法、使用方法以及与Stream API的结合,帮助读者更好地理解和运用这些新特性,提高代码的简洁性和可读性。
|
2月前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【2月更文挑战第21天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给方法,从而使代码更加简洁、易读。Stream API是一种用于处理集合的新API,它提供了一种高效且易于使用的处理数据的方式。本文将通过实例讲解这两个特性的基本用法以及它们如何帮助我们编写更简洁、高效的Java代码。
|
8天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。