让我们了解一下 lambda
嘿开发者!!! 我想出了另一篇基于 Java 的文章,它实际上与 Java 8 特性相关……它是 Lambda 表达式! 你知道他们吗? 实际上,它是作为对 Java 中匿名内部类的进一步增强而引入的。
那么什么是匿名内部类? 没有名称的类称为匿名内部类。 您可以在下面看到一个示例。 Java 线程使用 Runnable 接口提供此实现。
public class LambdaDemo {
public static void main(String[] args) {
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println("Thread created");
}
}).start();
}
}
当我们需要并且没有类名时,我们正在旅途中实现这些方法。否则我们无法从 Java 中的接口创建实例!当我打算做这几个接口时,很明显代码会变得混乱。所以,Java 使用 lambda 表达式对此进行了某种增强。它肯定会减少代码行数。
Lambda 表达式
Lambda 表达式基于函数式接口。
只包含一种方法(抽象方法)的接口被认为是功能接口。
因此,每当我们使用具有唯一方法的接口时,我们都可以在代码中使用该接口的任何地方使用 lambda 表达式。
请记住,除了唯一的抽象方法之外,任何功能接口都可以有更多方法。从 Java 8 开始,我们可以在任何接口中使用默认方法和静态方法。
Java 在内部实现中使用注解,以确保所需的接口被声明为功能接口。该注释称为@FunctionalInterface。你可以进入 Java 中的 Runnable 接口看到这个注解。它会像这样显示。
@FunctionalInterface
public interface Runnable {
void run();
}
无论如何,这个注释是可选的。 如果我们使用它,它将不允许我们在编译时违反该接口的规则。
和 Runnable 接口一样,Java 也有另一套函数式接口……
- 带有测试方法的谓词接口——用于 Java 流过滤方法。
- 带有 accept 方法的消费者接口 — 用于 Java 集合中的 forEach 方法。
- 带有 get 方法的供应商接口——用于返回不带参数的结果。
lambda 表达式的格式
(参数)-> { body } 或
( ) -> 正文
Lambda 的优势……
- 启用将功能视为方法参数(我们稍后会看到)
- 它可以在我们想要的任何时候轻松地与实现一起使用
- 减少代码行数
让我们看看如何使用 lambda 表达式……
Java 集合方法称为 forEach 以循环遍历元素。 让我们将此方法与 Lambda 一起使用。 它以消费者方法作为参数。
List<String> names = Arrays.asList("Sam", "Bob", "Sim");
names.forEach(number -> System.out.print(number + " "));
Java 流过滤器方法也将 Predicate 作为参数。
Predicate<String> predicate = name -> name.startsWith("S");
List<String> namesWithLetter = names.stream()
.filter(predicate)
.collect(Collectors.toList());
System.out.println(namesWithLetter);
也可以使用 lambda 覆盖 Java 线程运行方法。
Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
Thread thread = new Thread(runnable);
thread.start();
Java 供应商接口 get 方法也可以使用 lambda 覆盖。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Supplier<String> s1 = () -> dtf.format(LocalDateTime.now());
String time = s1.get();
System.out.println("Formatted Time: " + time);
在下面找到我使用了上述所有方法的 Java 代码片段。
public class LambdaDemo {
public static void main(String[] args) {
// CREATE SEPARATE CONSUMER TO MAKE STRINGS UPPERCASE
List<String> names = Arrays.asList("Sam", "Bob", "Sim");
// APPLY LAMBDA
names.forEach(number -> System.out.print(number + " "));
// APPLY LAMBDA WITH METHOD REFERENCE
names.forEach(System.out::println);
// CONSUMER "ACCEPT" METHOD IMPLEMENTATION
Consumer<String> changeCase = a -> System.out.println(a.toUpperCase());
// PASS LAMBDA AS A METHOD ARGUMENT
names.forEach(changeCase);
// PREDICATE "TEST" METHOD IMPLEMENTATION
Predicate<String> predicate = name -> name.startsWith("S");
// PROCESS DATA WITH FILTER
List<String> namesWithLetter = names.stream().filter(predicate).collect(Collectors.toList());
// PASS LAMBDA AS A METHOD ARGUMENT
System.out.println(namesWithLetter);
// RUNNABLE "RUN" METHOD IMPLEMENTATION
Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
// PASS LAMBDA AS A OBJECT TO THE CONSTRUCTOR
Thread thread = new Thread(runnable);
thread.start();
}
}
现在我们已经到了本文的结尾,伙计们! 我在 Lambda 表达式方面的知识尽可能多地包含在这里。 所以试着仔细阅读并抓住概念..
稍后我将返回另一篇关于 Java 的文章。直到那时,
大家再见!