Tag: lambda

如何告诉lambda函数捕获一个副本,而不是在C#中的引用?

我一直在学习C#,并试图理解lambda。 在下面的这个示例中,它打印出十次十次。 class Program { delegate void Action(); static void Main(string[] args) { List<Action> actions = new List<Action>(); for (int i = 0; i < 10; ++i ) actions.Add(()=>Console.WriteLine(i)); foreach (Action a in actions) a(); } } 显然,lambda后面的生成类正在存储对int ivariables的引用或指针,并且每次循环迭代时都将相同的引用分配一个新值。 有没有办法强制lamda抓取一个副本,而不是像C ++ 0x语法 [&](){ … } // Capture by reference 与 [=](){ … } // Capture […]

LambdaConversionException与generics:JVM的错误?

我有一些代码的方法引用编译罚款,并在运行时失败。 例外情况如此: Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEntity; not a subtype of implementation type interface redacted.HasImagesEntity at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:289) 这个class是这样的: class ImageController<E extends BasicEntity & HasImagesEntity> { void doTheThing(E entity) { Set<String> filenames = entity.getImages().keySet().stream() .map(entity::filename) .collect(Collectors.toSet()); } } 引发exception是为了parsingentity :: filename。 filename()在HasImagesEntity上声明。 据我所知,我得到了这个exception,因为E的擦除是BasicEntity,而JVM不能(不能)考虑E上的其他边界。 当我重写方法引用作为一个微不足道的lambda,一切都很好。 对我来说,一个结构按预期工作,其语义相当于爆炸似乎真的很可疑。 这可能是在规范? 我试图很难find一种方法,这不是在编译器或运行时的问题,并没有提出任何事情。

_(下划线)是一个保留关键字

我刚刚用下面的lambdaexpression式replace了s : s -> Integer.parseInt(s) Eclipse编译器说: '_'不应该被用作一个标识符,因为它是来自源级别1.8的保留关键字。 我还没有在JLS§3.9词法结构/关键词中find任何解释。

如何捕获一个lambdaexpression式unique_ptr?

我已经尝试了以下内容: std::function<void ()> getAction(std::unique_ptr<MyClass> &&psomething){ //The caller given ownership of psomething return [psomething](){ psomething->do_some_thing(); //psomething is expected to be released after this point }; } 但它不编译。 有任何想法吗? 更新: 如上所示,需要一些新的语法明确指定我们需要将所有权转移给lambda,我现在想的是下面的语法: std::function<void ()> getAction(std::unique_ptr<MyClass> psomething){ //The caller given ownership of psomething return [auto psomething=move(psomething)](){ psomething->do_some_thing(); //psomething is expected to be released after this point }; } 会不会是个好人选? […]

我怎样才能得到列表<T>中的每一个项目?

我正在使用.NET 3.5,并希望能够获得列表中的每个* n *项。 我不关心它是否使用lambdaexpression式或LINQ来实现。 编辑 看起来这个问题引起了很多辩论(这是一件好事,对吧?)。 我学到的主要事情是,当你认为你知道每一种做法(即使这样简单),再想一想!

绑定与Lambda?

我有一个关于哪种风格是首选的问题:std :: bind Vs lambda in C ++ 0x。 我知道他们服务于某些不同的目的,但让我们举一个相交function的例子。 使用lambda : uniform_int<> distribution(1, 6); mt19937 engine; // lambda style auto dice = [&]() { return distribution(engine); }; 使用bind : uniform_int<> distribution(1, 6); mt19937 engine; // bind style auto dice = bind(distribution, engine); 我们应该select哪一个? 为什么? 假设比上述例子更复杂的情况。 ie一个人的优点和缺点是什么?

在C ++ 11中用“auto”推导出什么是lambda的types?

我有一个感觉,lambda的types是一个函数指针。 当我进行下面的testing时,我发现它是错误的( 演示 )。 #define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } 上面的代码是否缺less任何一点? 如果不是那么,用auto关键字推导出lambdaexpression式的types是什么?

如何强制max()返回Java Stream中的所有最大值?

我已经testing了Java 8 lambdaexpression式和stream的max()函数,并且似乎在max()被执行的情况下,即使多于一个对象比较为0,它也会返回绑定候选中的任意元素进一步考虑。 是否有一个明显的技巧或function,这样一个最大期望的行为,以便所有的最大值返回? 我没有看到API中的任何内容,但我相信它必须比手动比较更好。 例如: //myComparator is an IntegerComparator Stream.of(1,3,5,3,2,3,5).max(myComparator).forEach(System.out::println); //Would print 5,5 in any order.

奇怪的行为:Lambda在列表理解中

在python 2.6中: [x() for x in [lambda: m for m in [1,2,3]]] 结果是: [3, 3, 3] 我预计输出是[1,2,3]。 即使使用非列表理解方法,我也会遇到同样的问题。 甚至在我将m复制到另一个variables之后。 我错过了什么?

使用Foreach子句的Lambdaexpression式

可能重复: 为什么IEnumerable接口上没有ForEach扩展方法? 编辑 作为参考,这里是eric在评论中提到的博客文章 http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx 弊 更多的好奇心,我想,但一个为C#规范Savants … 为什么ForEach()子句不能在IQueryable / IEnumerable结果集上使用(或不可用)… 你必须首先转换你的结果ToList()或ToArray()推测这是一个技术限制的方式C#迭代IEnumerables比。 列表…是否与IEnumerables / IQuerable集合的延期执行有关。 例如 var userAgentStrings = uasdc.UserAgentStrings .Where<UserAgentString>(p => p.DeviceID == 0 && !p.UserAgentString1.Contains("msie")); //WORKS userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas)); //WORKS Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas)); //Doesn't WORK userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));