Tag: lambda

C ++中的recursionlambda函数

在C ++ 11中编写recursionlambda函数有一个经常重复的“技巧”,如下所示: std::function<int(int)> factorial; factorial = [&factorial](int n) { return n < 2 ? 1 : n * factorial(n – 1); }; assert( factorial(5) == 120 ); (例如C ++ 0x中的recursionlambda函数 。) 这个技巧有两个直接的缺点: std::function<Sig>对象的目标被绑定(通过引用捕获)到一个非常特殊的std::function<Sig>对象(这里是factorial )。 这意味着函数通常不能从函数返回,否则引用将被留下。 另一个(虽然不那么直接)的问题是std::function的使用通常会阻止编译器优化,这是在实现中需要types擦除的副作用。 这不是假设的,可以很容易地进行testing。 在recursionlambdaexpression式真的很方便的假设情况下,是否有办法解决这些问题?

如何在LINQ select语句中使用Lambda

我试图select商店使用lambda函数,并将结果转换为SelectListItem,所以我可以呈现它。 但是它抛出了“ select条款中的expression式types不正确 ”错误: IEnumerable<SelectListItem> stores = from store in database.Stores where store.CompanyID == curCompany.ID select (s => new SelectListItem { Value = s.ID, Text = s.Name} ); ViewBag.storeSelector = stores; 我究竟做错了什么? 编辑: 另外,如何在这种情况下将Int转换为String? 以下不起作用: select (s => new SelectListItem { Value = s.ID.ToString(), Text = s.Name} ); select (s => new SelectListItem { Value […]

Collectors.toMap()keyMapper – 更简洁的expression式?

我想在下面的“Collectors.toMap()”调用中为“keyMapper”函数参数提供一个更简洁的expression式: List<Person> roster = …; Map<String, Person> map = roster .stream() .collect( Collectors.toMap( new Function<Person, String>() { public String apply(Person p) { return p.getLast(); } }, Function.<Person>identity())); 看来我应该能够使用lambdaexpression式来embedded它,但我不能拿出一个编译。 (我对lambda非常陌生,所以这并不令人意外。) 谢谢。 – >更新: 正如接受的答案中指出的那样 Person::getLast 是我一直在寻找的,而且是我曾经尝试过的。 然而,Eclipse 4.3的夜晚版本是个问题 – 它标记为错误的。 从命令行编译(我应该在发布之前完成),它工作。 那么,现在是时候用eclipse.org提交一个bug了。 谢谢。

如何正确确定一个对象是一个lambda?

我看到lambda的类是isSynthetic() && !isLocalOrAnonymousClass() ,但我认为对于代理类也是如此。 当然,我可以检查getDeclaredMethods().length == 1并将regexp应用于类名。 不过,我想知道是否有一个更优雅和健壮的选项,以找出一个给定的对象是否是lambda。

Java 8方法引用未处理的exception

我正在使用Java 8开发项目,发现一个我无法理解的情况。 我有这样的代码: void deleteEntity(Node node) throws SomeException { for (ChildNode child: node.getChildren()) { deleteChild(child); } } void deleteChild(Object child) throws SomeException { //some code } 此代码工作正常,但我可以用方法引用重写它: void deleteEntity(Node node) throws SomeException { node.getChildren().forEach(this::deleteChild); } 而且这段代码不能编译, Incompatible thrown types *SomeException* in method reference给出错误Incompatible thrown types *SomeException* in method reference 。 还IDEA给了我错误unhandled exception 。 那么,我的问题是为什么? 为什么代码为每个循环编译,不用lambda编译?

'委托'System.Action'不需要0个参数。' 这是一个C#编译器错误(lambdas +两个项目)?

考虑下面的代码。 看起来像完全有效的C#代码吧? //Project B using System; public delegate void ActionSurrogate(Action addEvent); //public delegate void ActionSurrogate2(); // Using ActionSurrogate2 instead of System.Action results in the same error // Using a dummy parameter (Action<double, int>) results in the same error // Project A public static class Class1 { public static void ThisWontCompile() { ActionSurrogate b = (a) […]

Lambdaexpression式中的多个Where子句

我有一个简单的lambdaexpression式,如下所示: x=> x.Lists.Include(l => l.Title).Where(l=>l.Title != String.Empty) 现在,如果我想再添加一个where子句到expression式,说, l.InternalName != String.Empty那么expression式是什么?

Java 8 Collectors.toMap SortedMap

我正在使用Java 8 lambdaexpression式,并希望使用Collectors toMap来返回一个SortedMap 。 我能想到的最好的办法是用一个mapSupplier于TreeMap::new的dummy mergeFunction和mapSupplier调用下面的Collectors toMap方法。 public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) { BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); […]

在C#中使用lambda创build的委托的生命周期是什么?

Lambdas很好,因为它们提供了简洁和本地化以及一个额外的封装forms 。 而不必编写只能用于lambda的函数。 在想知道他们是如何工作的时候,我直觉地认为他们可能只创build一次 。 这启发了我创build了一个解决scheme,它允许通过使用lambda作为其创build范围的标识符,将类成员的范围限制在一个特定范围之外 。 这个实现虽然可能是矫枉过正的(仍在研究它),但certificate了我的假设是正确的。 一个较小的例子: class SomeClass { public void Bleh() { Action action = () => {}; } public void CallBleh() { Bleh(); // `action` == {Method = {Void <SomeClass>b__0()}} Bleh(); // `action` still == {Method = {Void <SomeClass>b__0()}} } } lambda是否会返回一个新的实例,还是总是保持不变?

Expression类的目的是什么?

我想知道什么是包装Expression<>内的委托和不是? 我看到Expression<Foo>被Linq使用了很多,但到目前为止我还没有find任何解释这种差异的文章,只是使用了一个委托。 例如 Func<int, bool> Is42 = (value) => value == 42; 与 Expression<Func<int, bool>> Is42 = (value) => value == 42;