Tag: lambda

c ++ 0x:通过引用接收lambda作为参数的正确方法

什么是正确的方法来定义一个函数,通过引用接收int->int lambda参数? void f(std::function< int(int) >& lambda); 要么 void f(auto& lambda); 我不确定最后一种forms甚至是合法的语法。 是否有其他方法来定义一个lambda参数?

在HtmlHelper的扩展方法中从传递的lambdaexpression式获取属性值的最简单方法是什么?

我正在为HtmlHelper写一个肮脏的小扩展方法,这样我可以像HtmlHelper.WysiwygFor(lambda)那样说,并显示CKEditor。 我目前有这个工作,但似乎比我更喜欢一些麻烦。 我希望有一个更直接的方式来做到这一点。 这是我迄今为止。 public static MvcHtmlString WysiwygFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) { return MvcHtmlString.Create(string.Concat("<textarea class=\"ckeditor\" cols=\"80\" id=\"", expression.MemberName(), "\" name=\"editor1\" rows=\"10\">", GetValue(helper, expression), "</textarea>")); } private static string GetValue<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) { MemberExpression body = (MemberExpression)expression.Body; string propertyName = body.Member.Name; TModel model = helper.ViewData.Model; string value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToString(); […]

在Java8中引入lambdas会改变或影响哪个GoFdevise模式?

许多人声称,GoFdevise模式的最大部分只是缺乏头等function的解决方法。 现在Java即将获得lambdaexpression式,那么这些模式中的哪些将受到它们的影响? 哪些可以大大简化或泛化? 哪些基本上保持不变? 任何实际的例子是受欢迎的

lambda需要捕获“this”来调用静态成员函数?

对于下面的代码: struct B { void g() { []() { B::f(); }(); } static void f(); }; g ++ 4.6给出了错误: test.cpp:在lambda函数中: test.cpp:44:21:error:'this'没有被捕获到这个lambda函数 (有趣的是,g ++ 4.5编译好的代码)。 这是g ++ 4.6中的一个bug,还是真的有必要捕获“this”参数来调用静态成员函数? 我不明白为什么它应该是,我甚至有资格与B::呼叫。

注释Lambdaexpression式的function界面

Java 8引入了Lambdaexpression式和Type Annotations 。 使用types注释,可以像下面那样定义Java注释: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) public @interface MyTypeAnnotation { public String value(); } 然后可以在任何types的引用上使用这个注解,例如: Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() { @Override public void accept(String str) { System.out.println(str); } }; 这是一个完整的例子,使用这个注释来打印“Hello World”: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.AnnotatedType; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class Java8Example { […]

为什么在lambdas中隐式捕获const int(或shorts)?

这编译: int main() { const int x = 123; auto g = []() { std::cout << x << "\n"; }; g(); } 但是这个: int main(){ const float x = 123; auto g = []() { std::cout << x << "\n"; }; g(); } 生产: “错误:'x'未被捕获” 为什么? 我已经在GCC(从5.0.0到8.0.0的各种版本)和Clang(从4.0.0到6.0.0的各种版本)上testing过它。 它在所有情况下performance相同。

为什么我不能在lambda中捕获这个引用('&this')?

我理解在lambda中捕获this (修改对象属性)的正确方法如下: auto f = [this] () { /* … */ }; 但是我很好奇以下的特点: class C { public: void foo() { // auto f = [] () { // this not captured auto f = [&] () { // why does this work? // auto f = [&this] () { // Expected ',' before 'this' // […]

为什么使用invokedynamic调用Java 8 lambdas?

invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时硬连线。 这在dynamic语言中非常有用,在运行时,确切的方法和参数types是不知道的。 但是Java lambda不是这种情况。 它们被翻译成具有明确定义的参数的静态方法。 而且这个方法可以使用invokestatic来调用。 那么对lambdaexpression式invokedynamic的需求是什么,特别是当性能受到影响的时候呢?

为什么Stream.allMatch()对于空stream返回true?

我的同事和我有一个错误是由于我们的假设,一个空的stream调用allMatch()将返回false 。 if (myItems.allMatch(i -> i.isValid()) { //do something } 当然,假设和不读文档是我们的错。 但是我不明白为什么空stream的默认allMatch()行为返回true 。 这是什么原因? 和anyMatch() (相反地返回false)一样,这个操作是以一种命令的方式来使用的,它离开monad,可能用在if语句中。 考虑到这些事实,是否有任何理由为什么allMatch()默认为true空stream是可取的大多数用途?

有没有人将Lambda Expressions移植到Java 7?

读了Java 8从lambdas中产生的字节码types后 ,我想起Java 5发布的时候了。 那时候有Retroweaver和其他工具来转换用JDK 5编译的字节码以在JRE 1.4上运行。 有没有人为Java 8 lambdas创build了这样的backporting工具? Java开发人员现在就可以开始使用lambdas生产品质的Java 7 JRE,而不必等待Java 8 GA版本的6-12个月。 这里是我的分析,为什么像backporter应该可以相对容易地实现: Java 8 lambdas似乎没有使用Java 7不具备的任何JVM特性(例如invokedynamic ), java.lang.invoke.LambdaMetafactory类及其依赖关系看起来像纯Java,所以应该可以实现它们在第三方库中。 因此,使用JDK 8编译的字节码可以通过添加第三方库和LambdaMetafactory副本(位于不同的包中)并通过转换字节码来使用该元数据库来运行JRE 7。 也许还会生成一些合成类和方法来绕过可访问性检查,就像java.lang.invoke.MagicLambdaImpl似乎暗示的那样。 或者为所有lambda生成匿名内部类,就像第一个启用了lambda的Early Access JDK所做的那样。