标签: lambda

为什么C++ 11的lambda默认需要"可变"关键字用于按值捕获?

简短的例子:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}
Run Code Online (Sandbox Code Playgroud)

问题:为什么我们需要mutable关键字?它与传统参数传递给命名函数有很大不同.背后的理由是什么?

我的印象是,按值捕获的整个点是允许用户更改临时值 - 否则我几乎总是更好地使用按引用捕获,不是吗?

有什么启示吗?

(顺便说一句,我使用的是MSVC2010.这应该是标准的AFAIK)

c++ lambda c++11

249
推荐指数
11
解决办法
6万
查看次数

OrderBy在Lambda表达式中降序?

我知道在正常的Linq语法中,orderby xxx descending很容易,但是我如何在Lambda表达式中做到这一点?

linq lambda

246
推荐指数
4
解决办法
31万
查看次数

(lambda)函数闭包捕获了什么?

最近我开始玩Python,我遇到了一些特殊的闭包方式.请考虑以下代码:

adders=[0,1,2,3]

for i in [0,1,2,3]:
   adders[i]=lambda a: i+a

print adders[1](3)
Run Code Online (Sandbox Code Playgroud)

它构建了一个简单的函数数组,它接受单个输入并返回由数字添加的输入.函数在for循环中构造,迭代器i从中循环03.对于这些数字中的每一个,lambda都会创建一个函数i,该函数捕获并将其添加到函数的输入中.最后一行将第二个lambda函数3作为参数调用.令我惊讶的是输出结果是6.

我期待一个4.我的理由是:在Python中,一切都是一个对象,因此每个变量都是指向它的指针.在创建lambda闭包时i,我希望它存储一个指向当前指向的整数对象的指针i.这意味着当i分配一个新的整数对象时,它不应该影响先前创建的闭包.遗憾的是,adders在调试器中检查数组表明它确实存在.所有的lambda功能指的最后一个值i,3,这将导致adders[1](3)返回6.

这让我想知道以下内容:

  • 闭包捕获的内容是什么?
  • 什么是最优雅的方式来说服lambda函数以更改其值i时不会受到影响的方式捕获当前i值?

python lambda closures

237
推荐指数
5
解决办法
4万
查看次数

组合两个表达式(Expression <Func <T,bool >>)

我有两个类型的表达式,Expression<Func<T, bool>>我想采取OR,AND或NOT这些并得到一个相同类型的新表达式

Expression<Func<T, bool>> expr1;
Expression<Func<T, bool>> expr2;

...

//how to do this (the code below will obviously not work)
Expression<Func<T, bool>> andExpression = expr AND expr2
Run Code Online (Sandbox Code Playgroud)

c# linq lambda expression

232
推荐指数
5
解决办法
9万
查看次数

如何删除lambda事件处理程序

可能重复:
在C#中取消订阅匿名方法
如何取消注册"匿名"事件处理程序

我最近发现我可以使用lambdas来创建简单的事件处理程序.我可以订阅像这样的点击事件:

button.Click += (s, e) => MessageBox.Show("Woho");
Run Code Online (Sandbox Code Playgroud)

但你怎么取消订阅呢?

c# events lambda event-handling

223
推荐指数
1
解决办法
8万
查看次数

在Stream :: flatMap中使用Java 8的Optional

新的Java 8流框架和朋友们制作了一些非常简洁的Java代码,但是我遇到了一个看似简单的情况,简单易懂.

考虑一个List<Thing> things方法Optional<Other> resolve(Thing thing).我想将Things 映射到Optional<Other>s并获得第一个Other.显而易见的解决方案是使用things.stream().flatMap(this::resolve).findFirst(),但flatMap要求您返回一个流,并且Optional没有stream()方法(或者它是Collection一个方法或提供将其转换为或以其方式查看的方法Collection).

我能想到的最好的是:

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();
Run Code Online (Sandbox Code Playgroud)

但这似乎是一个非常普遍的案例,似乎非常冗长.谁有更好的主意?

java lambda java-8 java-stream

221
推荐指数
7
解决办法
13万
查看次数

使用LINQ进行多次排序

我从一个基本类开始,我想使用LINQ在List中操作,如下所示:

public class FooBar   
{  
    public virtual int Id { get; set; }  
    public virtual string Foo{ get; set; }  
    public virtual string Bar{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我最终发现使用非lambda LINQ的东西来解决我的问题.

// code somewhere else that works and gets the desired results  
var foobarList = GetFooBarList();  // Abstracted out - returns List<Foobar>  

// Interesting piece of code that I want to examine
var resultSet = from foobars in foobarList  
                orderby foobars.Foo, foobars.Bar  
                select foobars;

// Iterate and do something interesting  
foreach …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda

216
推荐指数
1
解决办法
16万
查看次数

Java 8 lambdas,Function.identity()或t-> t

我对该Function.identity()方法的用法有疑问.

想象一下以下代码:

Arrays.asList("a", "b", "c")
          .stream()
          .map(Function.identity()) // <- This,
          .map(str -> str)          // <- is the same as this.
          .collect(Collectors.toMap(
                       Function.identity(), // <-- And this,
                       str -> str));        // <-- is the same as this.
Run Code Online (Sandbox Code Playgroud)

是否有任何理由你应该使用Function.identity()而不是str->str(反之亦然).我认为第二种选择更具可读性(当然是品味问题).但是,有没有"真正的"理由为什么应该首选?

java lambda java-8

211
推荐指数
3
解决办法
10万
查看次数

lambda函数可以模板化吗?

在C++ 11中,有没有办法模板化lambda函数?或者它本身太具体而无法模板化?

我理解我可以定义一个经典的模板类/仿函数,但问题更像是:语言是否允许模板化lambda函数?

c++ lambda templates c++11

210
推荐指数
7
解决办法
8万
查看次数

Java 8 Streams:多个过滤器与复杂条件

有时您想要Stream使用多个条件过滤a :

myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)

或者你可以用复杂的条件和单一的方式 做同样的事情filter:

myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)

我的猜测是第二种方法具有更好的性能特征,但我不知道.

第一种方法在可读性方面取胜,但性能更好?

java lambda filter java-8 java-stream

206
推荐指数
3
解决办法
14万
查看次数