使用Java 编程,总会遇到很多函数接口,但Java 开发工具包(JDK)提供的一组核心函数接口会频繁出现,如图
每个函数Demo如下:
Function<T,R> R apply(T t);
Function<String, String> function = x -> x.toUpperCase(); Function<String, String> function2 = x -> x.toLowerCase(); convertString(function);// prints STRANGE convertString(function2);// prints strange public static void convertString(Function<String, String> function){ System.out.println(function.apply("StRaNgE")); }
Supplier<T> T get();
Supplier<String> supplier1 = () -> "String1"; Supplier<String> supplier2 = () -> "String2"; printSuppliedString(supplier1); printSuppliedString(supplier2); public static void printSuppliedString(Supplier<String> supplier){ System.out.println(supplier.get()); }
Consumer<T> void accept(T t);
Consumer<String$gt function = x -> System.out.println(x); Consumer<String$gt function2 = x -> System.out.println(x.toLowerCase()); consumeString(function, "StringA");// prints StringA consumeString(function2,"StringA");// prints stringa public static void consumeString(Consumer<String> consumer, String x) { consumer.accept(x); }
interface Predicate<T> boolean test(T t);
Predicate<Double> function = x -> x > 10; Predicate<Double> function2 = x -> x < -10; System.out.println(function.test(new Double(9)));// prints false System.out.println(function2.test(new Double(-20)));// prints true public static void testValue(Predicate<Double> predicate, Double d){ predicate.test(d); }
IntConsumer void accept(int value); This function accepts a primitive int and does not return any value
BiFunction<T, U, R> R apply(T t, U u); This function accepts two arguments and returns a value.
BinaryOperator<T> extends BiFunction<T,T,T> R apply(T t, U u); This function is a special case of BiFunction where both the input parameters and the return is of the same type.
Method References
To increase readability java8 has come up with method references. You can access a method (lambda expression) using the :: notation. The only condition that the methods need to follow is that they should be assignable to any FunctionalInterface as described above. There are four kinds of method references, we look at them in below.
public class Example { public int add(int a, int b) { return a + b; } public static int mul(int a, int b) { return a * b; } public String lower(String a) { return a.toLowerCase(); } public void printDate(Date date) { System.out.println(date); } public void oper(IntBinaryOperator operator, int a, int b) { System.out.println(operator.applyAsInt(a, b)); } public void operS(Function<String, String> stringOperator, String a) { System.out.println(stringOperator.apply(a)); } public GregorianCalendar operC(Supplier<GregorianCalendar> supplier) { return supplier.get(); } }
Lambda Expressions - Composition
Composition allows applying lambda expressions one after another. There are two methods:
-
Function compose(Function before)
- The before function is applied first and then the calling function -
Function andThen(Function after)
- The after function is applied after the calling function
Lets look at an example. This example creates a lambda expression for the Math functions. We can then apply one math function after another by using the
compose
and
andThen
methods. We can create a exp(log(sin)) or log(exp(sin)) etc .
import java.util.function.Function; public class ExampleCompose { public static void main(String[] args) { ExampleCompose ex = new ExampleCompose(); Function<Double , Double> sin = d -> ex.sin(d); Function<Double , Double> log = d -> ex.log(d); Function<Double , Double> exp = d -> ex.exp(d); ExampleCompose compose = new ExampleCompose(); System.out.println(compose.calculate(sin.compose(log), 0.8)); // prints log:sin:-0.22 System.out.println(compose.calculate(sin.andThen(log), 0.8)); // prints sin:log:-0.33 System.out.println(compose.calculate(sin.compose(log).andThen(exp), 0.8)); //log:sin:exp:0.80 System.out.println(compose.calculate(sin.compose(log).compose(exp), 0.8)); //exp:log:sin:0.71 System.out.println(compose.calculate(sin.andThen(log).compose(exp), 0.8)); //exp:sin:log:-0.23 System.out.println(compose.calculate(sin.andThen(log).andThen(exp), 0.8)); //sin:log:exp:0.71 } public Double calculate(Function<Double , Double> operator, Double d) { return operator.apply(d); } public Double sin(Double d) { System.out.print("sin:"); return Math.sin(d); } public Double log(Double d) { System.out.print("log:"); return Math.log(d); } public Double exp(Double d) { System.out.print("exp:"); return Math.exp(d); } }
相关推荐
本源码资源提供了Java中的函数式接口相关内容,包括接口定义和使用示例。它涵盖了函数式编程在Java中的基本概念、重要性以及如何使用函数式接口来实现函数式编程的方法。 本源码资源适用于具备一定Java编程基础的...
Java 8 中提供了 several 内置函数式接口,例如: * Consumer 消费型接口: ```java @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> ...
在本教程中,我们将深入探讨Java编程语言中的两个核心概念:动态代理和Java 8的新特性,特别是关于Java内置的函数式接口的介绍。动态代理是Java提供的一种机制,允许我们在运行时创建对其他对象的代理,从而在不修改...
Java 8引入了函数式接口的概念,这是一项重要的更新,旨在支持函数式编程风格。函数式接口是指只有一个抽象方法的接口,这样的设计使得接口能够被用作 Lambda 表达式的类型。Lambda 表达式是一种简洁的匿名函数表示...
12. **内置函数**:Java提供了一些内置函数,如`Math`类中的`sqrt()`(平方根)、`random()`(随机数)等。 13. **异常处理**:`try-catch-finally`语句块用于捕获和处理程序运行时可能出现的错误。 14. **Lambda...
1. Lambda表达式:Lambda表达式是Java 8的一个重要特性,它简化了对函数接口的实现。Lambda表达式由三部分组成:参数列表、箭头符号和函数体。例如,`(int x, int y) -> x + y` 是一个接受两个整数参数并返回它们之...
Java标准库提供了大量内置函数,涵盖了I/O、数学计算、字符串处理、集合操作等多个方面。 在Java中,函数定义通常包含以下部分: 1. 访问修饰符:public, private, protected 或默认,决定函数的可见性。 2. 返回...
Java提供了一系列内置函数,如`Math`类中的函数,用于执行数学运算,如求平方根、最大值和最小值等: ```java double squareRoot = Math.sqrt(16); // 计算平方根 ``` 5. **静态函数** 静态函数属于类,而不是...
此外,Java 8还提供了一些其他内置的函数式接口,如`BiFunction`(接受两个参数并返回一个结果)、`Runnable`(无参数无返回的行动)以及`Comparator`(比较两个对象的接口)。所有这些接口都设计为与Lambda表达式...
使用Java函数查询工具,开发者可以快速定位到需要的函数,避免了在大量源码或在线文档中寻找的时间,从而提高开发效率,特别是在处理复杂项目时。 7. **学习与进阶**: 对于初学者,这样的查询手册有助于理解和...
Java提供了一些内置函数,如`Math.abs()`用于求绝对值,`System.out.println()`用于打印输出。同时,我们也可以根据需求创建自己的函数。 6. **异常处理**: 在函数中,可能会遇到运行时错误,Java通过异常处理...
Java 8定义了一些内置的函数式接口,如`Runnable`, `Supplier`, `Consumer`, `Function`, `Predicate`等,它们为不同类型的函数操作提供了便利。 6. **领域特定语言(DSL)的构建** 函数式编程风格鼓励使用表达性强...
Java 8 内置函数式接口: * 四大核心函数式接口:Runnable、Callable、Predicate、Function * 其他函数式接口:Consumer、Supplier、BiFunction 等 Lambda 表达式的优点: * 简化代码:使用 Lambda 表达式可以...
1. **Lambda表达式**:Lambda表达式是Java 8中的一大亮点,它简化了处理函数接口的方式。Lambda表达式可以被视为一种轻量级的函数,可以被赋值给变量,作为参数传递,或者在方法中返回。例如,`Runnable r = () -> ...
6. **内置函数**:Java标准库提供了大量内置函数,如`Math`类中的`sqrt`(求平方根)、`random`(生成随机数)等,极大地简化了开发工作。 7. **递归函数**:在解决某些问题时,我们可能会用到递归函数,即函数在其...
2. **函数式接口**:为了支持lambda表达式,Java 8定义了函数式接口,如Runnable、Callable和Consumer等。这些接口只有一个抽象方法,可以被lambda表达式所代表。 3. **方法引用和构造器引用**:除了lambda表达式,...
Java 8引入了大量内置的函数式接口,如`java.util.function.Function`、`java.util.function.Consumer`、`java.util.function.Predicate`等,它们在编写简洁的函数式代码时扮演着重要角色。Lambda表达式是一种匿名...
9. **内置函数(内置方法)**:如`System.out.println()`用于输出,`Math.pow()`用于计算幂,都是Java提供的内置函数。 10. **回调函数**:通过传递函数作为参数,让其他函数在适当的时候调用,常用于异步编程。 ...
另一种创建线程的方法是实现Runnable接口,创建一个实现了Runnable接口的类,然后在Thread构造函数中传入该类的实例。线程启动后,会调用Runnable接口的run()方法。 9.4 线程的常用方法: - `start()`: 使线程从...