先看一段代码
public class Lambda { public static void main(String[] args) { System.setProperty("jdk.internal.lambda.dumpProxyClasses", "."); Function<Integer, String> fun1 = String::valueOf; Function<String, Integer> fun2 = String::length; System.out.println(fun1.apply(1)); System.out.println(fun2.apply("hello")); } }
那么,javac为我们做了什么呢?等价与那些代码呢?
对于第一种为
public static void main(String[] args) throws Throwable { MethodHandles.Lookup caller = MethodHandles.lookup(); String invokedName = "apply"; MethodType invokedType = MethodType.methodType(Function.class); MethodHandle implMethod = caller.findStatic(String.class, "valueOf", MethodType.methodType(String.class,int.class)); MethodType instantiatedMethodType = MethodType.methodType(String.class,int.class); CallSite site = LambdaMetafactory.metafactory(caller, invokedName, invokedType, instantiatedMethodType.generic(), implMethod, instantiatedMethodType); MethodHandle factory = site.getTarget(); Function<Integer,String> fun1 = (Function<Integer,String>) factory.invoke(); System.out.println(fun1.apply(1)); }
第二种为
MethodHandles.Lookup caller = MethodHandles.lookup(); String invokedName = "apply"; MethodType invokedType = MethodType.methodType(Function.class); MethodHandle implMethod = caller.findVirtual(String.class, "length", MethodType.methodType(int.class)); MethodType instantiatedMethodType = MethodType.methodType(int.class,String.class); CallSite site = LambdaMetafactory.metafactory(caller, invokedName, invokedType, instantiatedMethodType.generic(), implMethod, instantiatedMethodType); MethodHandle factory = site.getTarget(); Function<String,Integer> fun2 = (Function<String,Integer>) factory.invoke(); System.out.println(fun2.apply("hello"));
生成的具体类为
第一个
final class Lambda$$Lambda$1 implements Function { private Lambda$$Lambda$1() { } @LambdaForm.Hidden public Object apply(Object object) { return String.valueOf((Integer)object); } }
第二个
final class Lambda$$Lambda$2 implements Function { private Lambda$$Lambda$2() { } @LambdaForm.Hidden public Object apply(Object object) { return ((String)object).length(); } }
相关推荐
Java Lambda 表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使得处理集合数据和异步编程变得更加简洁。Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。...
Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...
Java Lambda表达式是Java 8引入的一个重要特性,它标志着Java开始支持函数式编程风格。在传统的面向对象编程中,我们通常通过创建对象并调用其方法来执行任务。而函数式编程则更加关注结果,而不是执行任务的具体...
关于性能,描述中提到了使用Lambda表达式可能带来的性能提升。虽然在单次执行时,Lambda表达式和匿名类的差异可能并不显著,但在大量重复或并发执行的情况下,Lambda的性能优势会显现出来。这是因为Lambda表达式通常...
Java 8是Java语言的一个重大版本更新,它引入了lambda表达式,这是Java平台的核心特性之一。Lambda表达式为Java带来了函数式编程的元素,使得开发者可以以更简洁的方式编写代码,尤其是在集合和多线程方面。本资料...
Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程风格的实现。Lambda表达式允许我们将函数作为一个值传递,就像传递其他数据类型一样。这在处理集合、事件驱动编程以及多线程等场景下尤其...
Java 8 的 Lambda 实践是 Java 语言的一个重要更新,引入了函数式编程的概念,极大地简化了处理集合和回调函数的方式。Lambda 表达式是这一特性的重要组成部分,它允许我们以更简洁、更易读的形式来表示匿名函数。...
Java Lambda表达式是Java 8引入的一项重大特性,它彻底改变了我们编写函数式编程的方式,使得代码更加简洁、高效。Lambda表达式的核心理念是将功能作为方法参数传递,或者将其存储为字段,甚至在没有显式类型声明的...
JAVA新特性Lambda的演示,让你通过实例,短时间内搞清什么是Lambda表达式及其用法。
Java 1.8引入了lambda表达式,这是Java语言的一项重大改进,显著提升了代码的简洁性和可读性,尤其在处理函数式编程场景时。Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,...
Java Lambda 是一种强大的语法特性,它在 Java 8 中被引入,使得函数式编程成为可能。Lambda 表达式简化了处理匿名函数的方式,让代码更简洁、易读。在这个"java lambda入门到高级代码实例"中,我们将深入探讨Lambda...
Java中的Lambda表达式是Java 8引入的一项重要特性,它为编写简洁、高效的代码提供了新的方式。Lambda表达式是函数式编程的一个核心概念,允许我们将函数作为方法的参数或者作为一个独立的对象来使用。这种能力使得...
Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...
Java Lambda 表达式是Java 8引入的一种新特性,它极大地简化了代码,特别是处理函数式编程场景。Lambda表达式本质上是匿名函数,可以作为参数传递,也可以被存储和复用。在Java中,它们通常与接口一起使用,这些接口...
Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...
Java 8引入了函数式接口的概念,这些接口只包含一个抽象方法,允许Lambda表达式的使用。Lambda表达式是一种简洁的表示匿名类的方法,它可以用于创建小型代码块,然后将其作为参数传递给方法或存储在变量中。类型推断...
Java Lambda 表达式介绍及使用 Java Lambda 表达式是 Java 语言中的一种函数式编程特性,允许将简单的函数作为操作传递给方法,或者将代码更简洁地定义在一个表达式的上下文中。Lambda 表达式在 Java 8 中被引入,...
走进Java Lambda