`
weiqingfei
  • 浏览: 318164 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

关于java的lambda

    博客分类:
  • Java
阅读更多

先看一段代码

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 Lambda 表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使得处理集合数据和异步编程变得更加简洁。Lambda表达式在Java中被设计为一种匿名函数,可以没有名称地传递,并且可以当作参数或返回值。...

    java8lambda表达式Demo

    Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...

    Java Lambda表达式方法使用详解.docx

    Java Lambda表达式是Java 8引入的一个重要特性,它标志着Java开始支持函数式编程风格。在传统的面向对象编程中,我们通常通过创建对象并调用其方法来执行任务。而函数式编程则更加关注结果,而不是执行任务的具体...

    JavaLambda表达式和匿名类.pdf

    关于性能,描述中提到了使用Lambda表达式可能带来的性能提升。虽然在单次执行时,Lambda表达式和匿名类的差异可能并不显著,但在大量重复或并发执行的情况下,Lambda的性能优势会显现出来。这是因为Lambda表达式通常...

    java 8 lambda- expressions 学习资料,例子。练习 java example

    Java 8是Java语言的一个重大版本更新,它引入了lambda表达式,这是Java平台的核心特性之一。Lambda表达式为Java带来了函数式编程的元素,使得开发者可以以更简洁的方式编写代码,尤其是在集合和多线程方面。本资料...

    Java lambda表达式和JVM字节码功能详解.pdf

    Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程风格的实现。Lambda表达式允许我们将函数作为一个值传递,就像传递其他数据类型一样。这在处理集合、事件驱动编程以及多线程等场景下尤其...

    java8 Lambda 实践

    Java 8 的 Lambda 实践是 Java 语言的一个重要更新,引入了函数式编程的概念,极大地简化了处理集合和回调函数的方式。Lambda 表达式是这一特性的重要组成部分,它允许我们以更简洁、更易读的形式来表示匿名函数。...

    lambda-change-java.rar_java lambda_lambda

    Java Lambda表达式是Java 8引入的一项重大特性,它彻底改变了我们编写函数式编程的方式,使得代码更加简洁、高效。Lambda表达式的核心理念是将功能作为方法参数传递,或者将其存储为字段,甚至在没有显式类型声明的...

    Java lambda.

    JAVA新特性Lambda的演示,让你通过实例,短时间内搞清什么是Lambda表达式及其用法。

    Java 1.8 lambda表达式示例源码

    Java 1.8引入了lambda表达式,这是Java语言的一项重大改进,显著提升了代码的简洁性和可读性,尤其在处理函数式编程场景时。Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,...

    java lambda入门到高级代码实例

    Java Lambda 是一种强大的语法特性,它在 Java 8 中被引入,使得函数式编程成为可能。Lambda 表达式简化了处理匿名函数的方式,让代码更简洁、易读。在这个"java lambda入门到高级代码实例"中,我们将深入探讨Lambda...

    Java Lambda表达式

    Java中的Lambda表达式是Java 8引入的一项重要特性,它为编写简洁、高效的代码提供了新的方式。Lambda表达式是函数式编程的一个核心概念,允许我们将函数作为方法的参数或者作为一个独立的对象来使用。这种能力使得...

    Java 8 lambda表达式

    Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...

    Java Lambda 环绕执行模式.pdf

    Java Lambda 表达式是Java 8引入的一种新特性,它极大地简化了代码,特别是处理函数式编程场景。Lambda表达式本质上是匿名函数,可以作为参数传递,也可以被存储和复用。在Java中,它们通常与接口一起使用,这些接口...

    java8 lambda表达式学习总结

    Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...

    Java 8新特性之Lambda与函数式编程.pdf

    Java 8引入了函数式接口的概念,这些接口只包含一个抽象方法,允许Lambda表达式的使用。Lambda表达式是一种简洁的表示匿名类的方法,它可以用于创建小型代码块,然后将其作为参数传递给方法或存储在变量中。类型推断...

    java lambda介绍及使用

    Java Lambda 表达式介绍及使用 Java Lambda 表达式是 Java 语言中的一种函数式编程特性,允许将简单的函数作为操作传递给方法,或者将代码更简洁地定义在一个表达式的上下文中。Lambda 表达式在 Java 8 中被引入,...

    走进Java Lambda

    走进Java Lambda

Global site tag (gtag.js) - Google Analytics