最近我有机会调整一些Java代码,并且能够利用一些新的Java 8特性。在一个特定的情况中,我需要从对象列表中获取一个 (String) .Name
属性的列表。下面是我所做的简化示例:
// sample data: <Thing> objects have a single String property called "Name"
List<Thing> thingList =
new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2")));
// first pass
List<String> nameList = new ArrayList<>();
thingList.forEach(x -> nameList.add(x.getName()));
// refinement 1: use stream, map, and collect
List<String> nameList1 =
thingList.stream().map(x -> x.getName()).collect(Collectors.toList());
// refinement 2: use "Thing::getName" method reference
List<String> nameList2 =
thingList.stream().map(Thing::getName).collect(Collectors.toList());
我很好奇这些方法如何转换成C#,结果我得到了
// sample data: <Thing> objects have a single String property called "Name"
var thingList = new List<Thing> { new Thing("Thing1"), new Thing("Thing2") };
// first pass
var nameList = new List<String>();
thingList.ForEach(x => nameList.Add(x.Name));
// refinement 1: use Select and ToList
List<String> nameList1 = thingList.Select(x => x.Name).ToList();
我还没有找到C#中等效于“refinement 2”的方法,可以用更简洁的东西替换Lambda表达式。在这种情况下,是否存在C#等效于Java 8的“方法引用”,特别是当我尝试获取每个对象的一个属性时(Java中使用getProperty
方法)?
.Select(GetName)
只是一种看起来像方法引用的语法糖,本质上它仍然是.Select(x => GetName(x))
。 - Cheng Chen