Tag: lambda

Java 8stream不可预知的性能下降没有明显的原因

我正在使用Java 8stream来迭代列表与子列表。 外部列表大小在100到1000之间变化(不同的testing运行),内部列表大小总是5。 有2个基准运行,performance出意想不到的性能偏差。 package benchmark; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.infra.Blackhole; import java.io.IOException; import java.util.concurrent.ThreadLocalRandom; import java.util.*; import java.util.function.*; import java.util.stream.*; @Threads(32) @Warmup(iterations = 25) @Measurement(iterations = 5) @State(Scope.Benchmark) @Fork(1) @BenchmarkMode(Mode.Throughput) public class StreamBenchmark { @Param({"700", "600", "500", "400", "300", "200", "100"}) int outerListSizeParam; final static int INNER_LIST_SIZE = 5; List<List<Integer>> list; Random rand() { return […]

C#不能在匿名方法体内使用ref或out参数

我试图创build一个函数,可以创build一个操作,增加任何整数传入英寸然而,我的第一次尝试是给我一个错误“不能在一个匿名方法体内使用ref或out参数”。 public static class IntEx { public static Action CreateIncrementer(ref int reference) { return () => { reference += 1; }; } } 我明白为什么编译器不喜欢这个,但我想有一个优雅的方式来提供一个很好的增量工厂,可以指向任何整数。 我看到要做到这一点的唯一方法就像下面这样: public static class IntEx { public static Action CreateIncrementer(Func<int> getter, Action<int> setter) { return () => setter(getter() + 1); } } 但是,这对于主叫方来说当然是一种痛苦。 要求调用者创build两个lambdaexpression式,而不是只传入一个引用。 有没有更优雅的方式来提供这种function,或者我将只需要住两个lambda选项?

linq / lambda中的多行foreach循环

我正在寻找一种方法来改变下面的代码: foreach (Contact _contact in contacts) { _contact.ID = 0; _contact.GroupID = 0; _contact.CompanyID = 0; } 我想改变这种使用LINQ / lambda到类似于: contacts.ForEach(c => c.ID = 0; c.GroupID = 0; c.CompanyID = 0); 但是,这是行不通的。 有没有什么办法可以在linq foreach中做多行,而不是写一个函数来做到这一点?

在java中从lambda forEach()返回

我试图改变一些for-each循环到lambda forEach()方法来发现lambdaexpression式的可能性。 后继似乎是可能的: ArrayList<Player> playersOfTeam = new ArrayList<Player>(); for (Player player : players) { if (player.getTeam().equals(teamName)) { playersOfTeam.add(player); } } 用lambda forEach() players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}}); 但下一个没有工作: for (Player player : players) { if (player.getName().contains(name)) { return player; } } 与lambda players.forEach(player->{if (player.getName().contains(name)) {return player;}}); 在最后一行的语法中是否有错,或者是否无法从forEach()方法返回?

使用lambdaexpression式代替IComparer参数

在C#中,是否可以在方法调用中将一个lambdaexpression式作为IComparerparameter passing? 例如类似的东西 var x = someIEnumerable.OrderBy(aClass e => e.someProperty, (aClass x, aClass y) => { return x.someProperty > y.SomeProperty ? 1 : x.someProperty < y.SomeProperty ? -1 : 0; } ); 我不能完全得到这个编译,所以我不猜测,但似乎lambda和匿名代表之间的这种明显的协同作用,我觉得我必须做一些愚蠢的错误。 TIA

有没有更好的方式来expression一个无参数lambda比()=>?

()似乎很愚蠢。 有没有更好的办法? 例如: ExternalId.IfNotNullDo(() => ExternalId = ExternalId.Trim());

需要帮助来更好地理解Moq

我一直在看Moq的文档,这些评论太短,我不能理解它可以做的每一件事情。 我没有得到的第一件事是It.IsAny<string>(). //example using string It.IsAny<string>(). //example using string 使用它只是为了增加一些价值吗? 如果你不关心价值,我知道人们会说这个,但是如果你不关心价值,那么你可以做“一”或什么东西? 这只是更多的打字。 其次,什么时候会是一个你不关心价值的例子? 我认为Moq需要价值来匹配东西。 我没有得到它。它是完全或如何使用它。 我不明白这个例子,它试图展示什么。 接下来,我不明白什么时候使用Times (及其AtMost方法和类似的)。 为什么要限制设置的次数? 我有一些AppConfig值,我需要使用两次。 为什么我想限制一次呢? 这只会使testing失败。 这是否阻止其他人添加另一个到您的代码或东西? 我没有得到如何使用mock.SetupAllProperties(); 它与什么build立属性? 我也不明白为什么有很多不同的方式来build立一个属性,以及它们有什么不同。 该文件有: SetupGet(of property) SetupGet<TProperty> 我注意到Moq中有很多东西显示()和<> – 它们之间有什么区别,它们看起来像在使用什么? 我也不明白为什么他们有SetupGet 。 你会不会使用SetupSet来设置属性? SetupSet有五种不同的方式在文档中使用它。 另外一个叫做SetupProperty 。 所以我不明白为什么有这么多。 在一个侧面说明,我想知道在lambda使用的variables是否独立于其他lambda。 例如: mock.setup(m => m.Test); stop.setup(m => m.Test); 这会好吗或者variablesm之间会有一些冲突吗? 最后,我正在看这个video ,我想知道它是否显示Visual Studio。 他的Intellisense看起来不一样。 一个灯泡popup了他(我很高兴我不这样做,因为它带回了netbeans痛苦的回忆),并且有从一个开放的支撑线到右支撑等行。 谢谢 […]

如何将一个lambdaexpression式存储为C ++ 11中的一个类的字段?

我想创build一个类,客户端可以存储一个类似于[]() -> void {}的lambdaexpression式作为类的字段,但我不知道如何去做。 一个答案build议使用decltype ,我试过没有成功。 这里是一个ideone源代码链接 。 以下是来源和结果: #include <cstdio> auto voidLambda = []()->void{}; class MyClass { public: decltype(voidLambda) t; MyClass(decltype(voidLambda) t) { this->t = t; } }; int main() { MyClass([] { printf("hi"); }); } 结果: prog.cpp: In constructor 'MyClass::MyClass(<lambda()>)': prog.cpp:3:79: error: no matching function for call to '<lambda()>::__lambda0()' prog.cpp:2:20: note: candidates are: […]

我应该复制一个std ::函数,或者我总是可以参考它吗?

在我的C ++应用程序(使用Visual Studio 2010)中,我需要存储一个std ::函数,如下所示: class MyClass { public: typedef std::function<int(int)> MyFunction; MyClass (Myfunction &myFunction); private: MyFunction m_myFunction; // Should I use this one? MyFunction &m_myFunction; // Or should I use this one? }; 正如你所看到的,我在构造函数中添加了函数参数作为参考。 但是,将函数存储在我的类中的最佳方法是什么? 我可以存储函数作为参考,因为std :: function只是一个函数指针,并保证函数的“可执行代码”保留在内存中? 如果lambda传递并且调用者返回,是否必须创build副本? 我的直觉告诉我们,存储一个引用(甚至是一个const引用)是安全的。 我希望编译器在编译时为lambda生成代码,并在应用程序运行时将此可执行代码保存在“虚拟”内存中。 因此,可执行代码永远不会被“删除”,我可以安全地存储对它的引用。 但这是真的吗?

Func <string,string>和delegate有什么区别?

我以两种forms看到代表: A. Func<string, string> convertMethod = lambda B. public delegate string convertMethod(string value); 我不确定这两者之间究竟有什么区别。 他们都是代表吗? 我相信第一个将使用lambda,第二个将有一个方法来实际执行工作。 我也可能会感到困惑。