海口网站建设哪个好薇,郑州企业网络推广,wordpress怎么安装插件,承德市外贸网站建设lambdas for什么是Lambda#xff1f; Lambda表达式是一种匿名函数#xff0c;可以在方法中内联编写#xff0c;并且可以在使用表达式的任何地方使用。 有时您可能会发现它们被称为闭包#xff0c;尽管我在下面解释了对该参考的一些注意事项。 像普通的Java方法一样#xf… lambdas for 什么是Lambda Lambda表达式是一种匿名函数可以在方法中内联编写并且可以在使用表达式的任何地方使用。 有时您可能会发现它们被称为闭包尽管我在下面解释了对该参考的一些注意事项。 像普通的Java方法一样它具有参数和可以执行的主体。 Java 8中令人兴奋的新功能之一是lambda表达式该表达式已定义为JSR 335的一部分。 添加lambda表达式将使Java更轻松地支持函数式编程技术和高阶函数。 这并不是说突然变成一夜之间成为诸如Haskell之类的奇特而深奥的语言但是它将朝着与诸如CRuby或python之类的语言一样的方向发展。 也就是说为有意义的功能样式提供部分支持但仍允许您使用命令式技术例如可变变量。 基本语法 这是一个lambda表达式该表达式使数字递增1 x - x 1 如您所见表达式以参数开头以参数主体结尾并用箭头将两者分开。 您也可以显式键入参数在参数上放置类型注释或具有多个参数。 如果您想执行这些操作则需要将参数放在方括号中例如 // Explicit Types(Integer x) - x 1// Multiple Arguments(Integer x1, Integer x2) - x1 1// Annotations:(Integer x1, SuppressWarnings(unused) Integer x2) - x1 1 到目前为止所有的lambda主体都是表达式但是您也可以像常规方法一样将主体编写为一系列语句。 (x) - { x 5; System.out.println(x); return x;
}; 由于lambda是正则表达式因此您可以将其视为正则表达式。 例如您可以将它们分配给变量将它们作为参数传递给其他方法。 // a method:
public static void useFunc(IntFun f) { System.out.println(f.apply(2));
} // in code
IntFun inc x - x 1;
useFunc(inc);
useFunc(x - x 1);类型 由于这是Java因此即使不是所有这些“ x”参数都标记为“整数”所有这些函数仍然是静态类型的。 幸运的是Java 7中方法句柄的引入提供了一种引用方法本身的方法。 这意味着您的函数并不需要全部实现某个通用接口它们可以是被认为是“函数接口”的任何东西。 引用规范草案“功能接口是仅具有一种抽象方法的接口因此表示单个功能协定。” 这些也可以用首字母缩写词“ SAM”来表示它代表“单一抽象方法”。 例如 interface Runnable { void run(); } interface Function { public R apply(A a); } interface IntFun extends Function {} // equals is defined by java.lang.Object, so this only has one abstract method
interface Comparator { boolean equals(Object obj); int compare(T o1, T o2);
} 因此通过确保使用保持这些约束的接口当前正在编写/正在编写的任何API都可以被lambda使用。 Guava库是一个已经鼓励有限的功能编程风格的示例API。 更有趣的例子 经验丰富的函数式程序员会意识到map函数该函数会为您返回一个新列表其中每个值都由函数更改。 在番石榴世界中此功能称为“变换”。 这是您今天可以编写的一些Java代码示例使用它来递增列表 Collection result transform(newArrayList(1, 2, 3), new Function() { Override public Integer apply(Integer x) { return x 1; }
}); 这是一个高阶函数的示例即以函数为参数或返回函数的函数。 转换函数使迭代集合和构建新集合的过程抽象化从而可以编写更多抽象的高级代码。 不幸的是由于我们受到了很多行噪声的干扰因此在一定程度上克服了可读性的优势但是如果您使用lambda重写它 Collection result transform(newArrayList(1, 2, 3),x - x 1); 另一个常用的高阶函数是滤波函数。 如果为它提供一个集合和一个谓词它将返回一个新集合其中包含该谓词对其适用的旧集合中的元素。 这是一个以匿名内部类样式和lambda表达式方式编写的代码示例。 Collection threeAndFive filter(newArrayList(1, 3, 5), new Predicate() { Override public boolean apply(Integer x) { return x 2; }
}); Collection threeAndFiveByLambda filter(newArrayList(1, 3, 5),x - x 2);方法参考 当然您可能已有一个已经定义了许多方法的现有代码库您希望使用它们代替lambda。 目前这在Java中也可以使用匿名内部类实现但同样麻烦。 除了提供lambda表达式外JSR 335还提出了一些语法糖以使此过程更容易。 您可以使用::符号作为已编写的现有方法的方法参考。 这是前面的示例但是使用了方法参考 // Existing method
public static boolean greaterThanTwo(Integer x) { return x 2;
} // prints [3, 5]
System.out.println(filter(newArrayList(1,3,5),LambdasExample::greaterThanTwo));他们真的是闭包吗 在引言中我提到过lambda表达式可以称为closures 。 这意味着一个函数能够引用其正常范围之外的变量或者被封闭在周围范围的自由变量之上。 int value 5; IntFun addValue x - x value; 在此代码示例中“ addValue”功能能够引用周围范围中的名为“ value”的变量尽管对此有一些警告。 如果您之前编写过匿名内部类那么您会回想起它们只能引用周围的变量这些变量被标记为final即未分配给它们。 这里的限制是相似的只是它已被概括为最终有效的限制 。 简而言之您可以引用未分配给多个变量的变量。 原理是如果变量被标记为final或可以被标记为final而不引入编译器错误则该变量实际上是final。 尝试和链接 lambdas规范的早期草案审核的一部分已经在线发布并且如果您想了解正在发生的事情的来龙去脉那么这可能对您来说很有趣。 如果您有兴趣尝试编写一些lambda代码则已经有二进制快照 。 这些内容经常更新如果您想了解lambda内部结构的实质可以尝试构建源代码 。 关于使用二进制代码编写代码的唯一警告是由于它仍处于草稿版本中并且仍在使用“”运算符而不是“ ::”作为方法参考语法因此仍然存在一些bug。 摘要 这是对Java 8的Lambda表达式的某些概念的介绍因此简化了所涉及的一些问题但对于读者来说了解即将发生的事情应该足够了。 很高兴看到Oracle在事物的语言方面引入了一些有用的更改这种更改已经停滞了一段时间。 参考 Lambdas来到您附近的Java 8 从我们的JCG合作伙伴 Richard Warburton在Insightful Logic博客中获得。 翻译自: https://www.javacodegeeks.com/2013/07/lambdas-coming-to-a-java-8-near-you.htmllambdas for