C#lambda表达式可以包含多个语句吗?
(编辑:正如以下几个答案中所提到的,这个问题最初是关于"行"而不是"陈述".)
我以前读了几篇Java 8教程.
现在我遇到了以下主题: java支持Currying吗?
在这里,我看到以下代码:
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
System.out.println(curriedAdd.apply(1).applyAsInt(12));
Run Code Online (Sandbox Code Playgroud)
我明白这个例子总结了2个元素,但我无法理解构造:
a -> b -> a + b;
Run Code Online (Sandbox Code Playgroud)
根据表达式的左侧部分,该行应实现以下功能:
R apply(int value);
Run Code Online (Sandbox Code Playgroud)
在此之前,我只用一支箭只遇到了lambdas.
除了保存代码行之外,lambda表达式还有什么用处吗?
lambda提供的特殊功能是否解决了不容易解决的问题?我见过的典型用法是代替写这个:
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
};
Run Code Online (Sandbox Code Playgroud)
我们可以使用lambda表达式来缩短代码:
Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());
Run Code Online (Sandbox Code Playgroud) 阅读Java-8规范,我不断看到对"SAM类型"的引用.我无法找到明确解释这是什么.
什么是SAM类型以及什么是何时可以使用的示例场景?
Google Guava有一个始终返回true的谓词.Java 8有类似的东西Predicate吗?我知道我可以使用(foo)->{return true;},但我想要预制的东西,类似于Collections.emptySet().
使用方法调用很容易从lambda转到Expression
public void GimmeExpression(Expression<Func<T>> expression)
{
((MemberExpression)expression.Body).Member.Name; // "DoStuff"
}
public void SomewhereElse()
{
GimmeExpression(() => thing.DoStuff());
}
Run Code Online (Sandbox Code Playgroud)
但我想将Func转换为表达式,仅在极少数情况下......
public void ContainTheDanger(Func<T> dangerousCall)
{
try
{
dangerousCall();
}
catch (Exception e)
{
// This next line does not work...
Expression<Func<T>> DangerousExpression = dangerousCall;
var nameOfDanger =
((MemberExpression)dangerousCall.Body).Member.Name;
throw new DangerContainer(
"Danger manifested while " + nameOfDanger, e);
}
}
public void SomewhereElse()
{
ContainTheDanger(() => thing.CrossTheStreams());
}
Run Code Online (Sandbox Code Playgroud)
不起作用的行给了我编译时错误Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'.显式强制转换无法解决问题.我有一个设施可以做到这一点吗?
sort(mMyClassVector.begin(), mMyClassVector.end(),
[](const MyClass & a, const MyClass & b)
{
return a.mProperty > b.mProperty;
});
Run Code Online (Sandbox Code Playgroud)
我想使用lambda函数来排序自定义类来代替绑定实例方法.但是,上面的代码会产生错误:
错误C2564:'const char*':对内置类型的函数式转换只能接受一个参数
它工作得很好boost::bind(&MyApp::myMethod, this, _1, _2).
如何使用lambda将多列分组?
我看到了如何使用linq实现它的示例,但我正在寻找lambda形式.
我正在使用.NET 3.5,并希望能够n从列表中获取每个**项.我对使用lambda表达式还是LINQ实现它并不感到困扰.
编辑
看起来这个问题激起了很多争论(这是一件好事,对吧?).我学到的主要是,当你认为你知道每一种做某事的方式时(尽管这很简单),再想一想!
auto在C++ 14标准中,通用lambda如何工作(关键字作为参数类型)?
它是基于C++模板的,每个不同的参数类型编译器生成一个具有相同主体但替换类型(编译时多态)的新函数,还是更类似于Java的泛型(类型擦除)?
代码示例:
auto glambda = [](auto a) { return a; };
Run Code Online (Sandbox Code Playgroud)